我正在尝试从数组(子文档)中提取/删除值。
示例doc:
{
_id: 5150a1199fac0e6910000002,
name: 'some name,
items: [{
id: 23,
name: 'item name 23'
},{
id: 24,
name: 'item name 24'
}]
}
我有记忆中的文件,因为我已经从mongo中取出了它。我在尝试:
var left = object.items.pull({id: 24});
console.log(left)
输出:
[{
id: 23,
name: 'item name 23',
_id: 5150a1199fac0e6910000045
},{
id: 24,
name: 'item name 24',
_id: 5150a1199fac0e6910000002
}]
看起来我已经有问题了。从拉取调用返回的数组应该是拉出后数组中剩下的数据。不知道为什么它没有从项目数组中拉出来。这只支持通过ObjectId而不是用户定义的字段拉动吗?
我打电话给保存:
object.save();
Mongoose将此记录为查询:
Mongoose: mycollection.update({ _id: ObjectId("5150901ac345824a07000002"), __v: 3 })
{ '$inc': { __v: 1 }, '$pull':
{ attachments: { _id: { '$in': [ ObjectId("5150c64d63773efb1f000002") ] } } } } {}
这表明我的文档未被删除的原因。应删除的数组项的_id是:
_id: 5150a1199fac0e6910000002
mongoose发送到要删除的数据库的项目是:
ObjectId("5150c64d63773efb1f000002")
任何想法我做错了什么?我试图通过_id之外的其他东西删除,不确定这是否可行,但是从文档看起来是。
答案 0 :(得分:14)
我发现$ pull命令对我来说不起作用,除非我在参数列表中包含回调。
在我的情况下,这种格式不起作用:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}});
但这种格式确实如此:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}, function(err, data){
console.log(err, data);
});
根据文档,似乎两者都应该有效,但事实并非如此。原因是第一种方法要求您在返回的对象上调用.exec(),而回调版本则自动调用exec()。对我也造成了一些困惑。
所以你需要做这样的事情:
UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}).exec();