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();
});