Node.js NodeJS/Mongoose/MongoDB-拉(从阵列)不工作

Node.js NodeJS/Mongoose/MongoDB-拉(从阵列)不工作,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图从数组(子文档)中提取/删除值 示例文档: { _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:

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

示例文档:

{
   _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 ant而不是用户定义的字段进行拉取

我叫save:

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之外的其他方式删除,不确定这是否可行,但从文档中看起来是这样的。

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

就连我也面临着同样的问题。是否有任何方法可以在实例上而不是模型上执行
pull
,即
user.alerts.pull()
而不是
user.findOneAndUpdate()
?@user2235057的可伸缩性不太好。如果在同一时间触发了多个相同调用,则可能会发生实例冲突。