NodeJS/Mongoose/MongoDB - 拉(从数组)不工作

los*_*ion 5 mongoose mongodb node.js

我试图从数组(子文档)中提取/删除值.

示例文档:

{
   _id: 5150a1199fac0e6910000002,
   name: 'some name,
   items: [{
      id: 23,
      name: 'item name 23'
   },{
      id: 24,
      name: 'item name 24'
   }]
}
Run Code Online (Sandbox Code Playgroud)

当我从mongo中取出它时,我有记忆中的文档.我在尝试:

var left = object.items.pull({id: 24});
console.log(left)
Run Code Online (Sandbox Code Playgroud)

输出:

[{
   id: 23,
   name: 'item name 23',
   _id: 5150a1199fac0e6910000045
},{
  id: 24,
  name: 'item name 24',
  _id: 5150a1199fac0e6910000002 
}]
Run Code Online (Sandbox Code Playgroud)

所以看起来我已经有问题了.从拉取调用返回的数组应该是拉出后数组中剩下的数据.不知道为什么它没有从项目数组中拉出来.这只支持通过ObjectId ant而不是用户定义的字段吗?

我叫保存:

object.save();
Run Code Online (Sandbox Code Playgroud)

Mongoose将此记录为查询:

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

这表明我的文档未被删除的原因.应删除的数组项的_id是:

_id: 5150a1199fac0e6910000002
Run Code Online (Sandbox Code Playgroud)

mongoose发送到数据库删除的项目是:

ObjectId("5150c64d63773efb1f000002")
Run Code Online (Sandbox Code Playgroud)

我有什么想法我做错了吗?我试图通过_id以外的东西删除,不确定这是否可行,但是从文档看起来是这样.

All*_*len 14

我发现$ pull命令对我来说不起作用,除非我在参数列表中包含回调.

在我的情况下,这种格式不起作用:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}});
Run Code Online (Sandbox Code Playgroud)

但是这种格式做了:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}, function(err, data){
  console.log(err, data);
});
Run Code Online (Sandbox Code Playgroud)

根据文档,似乎两者都应该工作,但不是.原因是第一种方法要求您在返回的对象上调用.exec(),而回调版本则自动调用exec().也给我带来了一些困惑.

所以你需要做这样的事情:

UserAlerts.findOneAndUpdate({userId: userId}, {$pull: {alerts: {_id: alertId}}}).exec();
Run Code Online (Sandbox Code Playgroud)

  • @ user2235057,不是很可扩展.如果同时触发多个同一个调用,则可能会发生实例冲突. (2认同)