2013-03-25 46 views
3

我试图从数组(子文档)中拉/取值。NodeJS/Mongoose/MongoDB - 拉(从数组中)不起作用

实例文档:

{ 
    _id: 5150a1199fac0e6910000002, 
    name: 'some name, 
    items: [{ 
     id: 23, 
     name: 'item name 23' 
    },{ 
     id: 24, 
     name: 'item name 24' 
    }] 
} 

我在内存中的文档,因为我从蒙戈把它了。我想:

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 
}] 

所以看起来像我已经有一个问题。从pull调用返回的数组应该是pull之后数组中剩余的数组。不知道为什么它没有从项目数组中拉出来。这是否仅支持通过ObjectId ant而不是用户定义的字段?

我打电话保存:

object.save(); 

猫鼬将这一情况记录查询:

Mongoose: mycollection.update({ _id: ObjectId("5150901ac345824a07000002"), __v: 3 }) 
    { '$inc': { __v: 1 }, '$pull': 
    { attachments: { _id: { '$in': [ ObjectId("5150c64d63773efb1f000002") ] } } } } {} 

这说明了为什么我的文件没有被删除。应删除的数组项的_id是:

_id: 5150a1199fac0e6910000002 

是猫鼬被发送到数据库中移除该项目是:

ObjectId("5150c64d63773efb1f000002") 

任何想法我做错了吗?我试图删除_id以外的东西,不知道这是否可能,但从文档看起来是。

回答

11

我发现$ 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(); 
+0

即使我面临着同样的问题。有没有什么办法可以对实例执行'pull'而不是'user.alerts.pull()'而不是'User.findOneAndUpdate()'模型? – Raeesaa 2014-04-28 06:11:01

+1

@ user2235057这不会很有伸缩性。如果多个同一个电话同时被触发,您可能会碰撞实例。 – FRD 2014-08-21 14:23:51