【问题标题】:NodeJS/Mongoose/MongoDB - Pull (from array) not workingNodeJS/Mongoose/MongoDB - 拉(从数组)不起作用
【发布时间】:2013-03-15 13:45:36
【问题描述】:

我正在尝试从数组(子文档)中提取/删除值。

示例文档:

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

看来我已经有问题了。从 pull 调用返回的数组应该是 pull 之后数组中剩下的内容。不知道为什么它没有从项目数组中提取。这是否仅支持通过 ObjectId ant 而不是用户定义的字段进行拉取?

我调用保存:

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 以外的方式删除,不确定这是否可能,但从文档看来是。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我发现 $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 这不会是非常可扩展的。如果同时触发了多个相同的调用,则可能会发生实例冲突。
    猜你喜欢
    • 2018-06-30
    • 2014-11-27
    • 2019-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 2022-09-23
    • 2019-02-23
    相关资源
    最近更新 更多