【问题标题】:findAndModify MongoDB insert element at beginning of arrayfindAndModify MongoDB 在数组开头插入元素
【发布时间】:2014-11-15 08:09:22
【问题描述】:

更新: 这里的问题是本机 MongoDB 驱动程序需要与 Mongoose 不同格式的 objectID。我需要做的不是 {_id:story_id},而是 {_id:new mongoose.Types.ObjectId(story_id)}。它只返回两个字段的原因是它正在使用 {_id:story_id} 创建一个新文档,而不是更新 {_id: {$oid:story_id}} 的文档。但是,我最初使用本机驱动程序与猫鼬进行此操作的原因被证明是行不通的。甚至本机驱动程序也不接受正的 $slice 值。所以我仍在寻找一种方法,使用 Mongoose 或通过 Mongoose 访问的本机驱动程序(不支持 $position 或正 $slice 值)将对象插入到数组的开头。

当我运行下面的查询时,返回的结果只包括_id、消息和参与者。我想取回完整的故事记录,而不仅仅是更新的字段。有没有办法做到这一点?根据 Node MongoDB Native 驱动程序文档 (http://mongodb.github.io/node-mongodb-native/api-generated/collection.html#findandmodify),来自 mongo 控制台的“fields”参数未在 findAndModify 驱动程序中实现。我想避免为了获取刚刚更新的记录而进行第二次查询。

Story.collection.findAndModify(
{"_id": story_id},
{"_id": "asc"},
{ 
    "$push": {
"messages": {
  "$each": [message],
  "$sort": { "_id": -1},
  "$slice": 500 
    },
  },
    "$addToSet": {"participants": user_id},
},
    {new: true},
    {fields: {"feeling":1, "description":1, "image_height":1, "image_width":1, "storyteller":1, "image_url":1, "participants":1}},   // -> this line is ignored by MongoDB native driver

      {upsert: true}

)

【问题讨论】:

  • 如果你在使用 Mongoose,为什么不打电话给Story.findByIdAndUpdate?无论如何,您应该取回整个文档,而不仅仅是更新的字段。
  • Mongoose findByIdAndUpdate 不支持添加到数组的开头,就像我在这里使用 $sort 和 $slice 所做的那样(Mongoose 查找负的 $slice 值并返回错误。此查询为此处显示的不会返回整个文档。

标签: node.js mongodb mongoose


【解决方案1】:

您可以在带有 $push 的数组字段的开头插入元素,该字段使用 $each$position 修饰符(Mongoose 支持):

Story.findByIdAndUpdate(story_id, {
    $push: {
      messages: {
        $each: [message],
        $position: 0
      },
    },
    $addToSet: {participants: user_id},
  }, {
    new: true,
    upsert: true
  },
  function (err, newDoc) { ... }
);

【讨论】:

  • Mongoose 不支持传递 $position 参数。见:github.com/LearnBoost/mongoose/issues/2024 和最后回复在这里”stackoverflow.com/questions/23083041/… mongoose 的错误是 $each 只能与 $sort 或 $slice 配对
  • @PraneethWanigasekera 该错误被标记为fixed in 3.8.12,当我使用 Mongoose 3.8.16 对其进行测试时它运行良好。
  • 如果它有效,那就太棒了。我也在使用 3.8.16。这是我使用上述代码得到的错误:{ [OperationalError: exception: $each term 只需要 $slice (和可选的 $sort) 作为补充] name: 'OperationalError', message: 'exception: $each term 只需要 $slice (以及可选的 $sort)作为补语,原因:{ [MongoError: exception: $each term 只有 $slice(和可选的 $sort)作为补语] 非常感谢您的帮助。
  • @PraneethWanigasekera $position 支持已在 MongoDB 2.6 中添加。你运行的是什么服务器版本?
  • 是的,你是对的。我认为这就是正在发生的事情。我相信我无法控制的 Mongolab 数据库版本是 2.4.5。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多