Mongoose-удалить элемент массива вложенных документов

у меня есть эта маленькая схема для пользователей:

{
 username: String,
 contacts: Array
}

так, например, некоторые контакты пользователя будут выглядеть следующим образом:

{
 username: "user",
 contacts: [{'id': ObjectId('525.....etc'), 'approved': false}, {'id':ObjectId('534.....etc'), 'approved': true}]
}

теперь мне нужно удалить элемент из контактов, так что я делаю:

model.findByIdAndUpdate(23, {'$pull': {
              'contacts':{'id':'525.....etc'}
              }});

но, кажется, не работает, нет ошибок, но он не удаляется, я просто хотел бы вернуть этот документ для пользователя:

{
     username: "user",
     contacts: [{'id':ObjectId('534.....etc'), 'approved': false}]
    }

как этого добиться?

2 ответов


на $pull оператор фактически просто выполняет условия для элемента массива, на котором он работает. Кажется, что ваш вопрос может на самом деле не показать, что вы, вероятно, работаете с ObjectId значением, что Мангуст создает по умолчанию для всех полей массива.

таким образом, вы можете выполнить свой запрос следующим образом, после импорта ObjectId метод создания:

model.findByIdAndUpdate(23, {
    '$pull': {
        'contacts':{ '_id': new ObjectId(someStringValue) }
    }
});

или на самом деле вы можете определить свою "схему" немного лучше, и Мангуст на самом деле "autocast" ObjectId для вас на основе "типа", определенного в схеме:

var contactSchema = new Schema({
    approved: Boolean
});

var userSchema = new Schema({
    username: String,
    contacts: [contactSchema]
});

это позволяет Мангусту "следовать правилам" для строго типизированных определений полей. Так что теперь это знает что у вас на самом деле есть _id поле для каждого элемента массива контактов, и "тип" этого поля на самом деле является ObjectId таким образом, он автоматически переформулирует "строковые" значения, поставляемые как истинный ObjectId.


finaly!

MongoDB:

"imgs" : {"other" : [ {
        "crop" : "../uploads/584251f58148e3150fa5c1a7/photo_2016-11-09_21-38-55.jpg",
        "origin" : "../uploads/584251f58148e3150fa5c1a7/o-photo_2016-11-09_21-38-55.jpg",
        "_id" : ObjectId("58433bdcf75adf27cb1e8608")
                                    }
                            ]
                    },
router.get('/obj/:id',  function(req, res) {
var id = req.params.id;



Model.findOne({'imgs.other._id': id}, function (err, result) {
        result.imgs.other.id(id).remove();
        result.save();            
    });