【问题标题】:Insert an array item after a specific value in mongodb在 mongodb 中的特定值之后插入一个数组项
【发布时间】:2016-06-17 22:57:41
【问题描述】:

我有类似的数据库;

{"_id" : 1 , children: ["2", "123", "5"]}

我想在 children 数组中插入一个元素。当您知道索引时,这很容易。 $position 可用于此目的。喜欢;

db.module_menu.update({"_id" : "1"} , 
                      {$push : {"children" : { 
                                  $each : ["12"] , $position : 1}}});

但是假设我不知道位置索引,我知道我想要插入的元素的值。

我有value: 12 和我想在之后插入的值。 insertAfter: 2

结果应该是这样的;

{"_id" : 1, text: "" , children: ["2","12", "123", "5"]}

我该怎么做?

遍历子数组中的每个元素,找到值的索引,然后使用 $position 插入值。这是唯一的方法吗?

【问题讨论】:

  • 你可以试试$addToSet
  • $addToSet 可能无法保持数组顺序
  • $addToSet 和 $push 一样吗?它添加到集合的末尾。我错了吗?
  • 不,它们在这一点上是不同的:$addToSet 仅确保没有重复的项目添加到集合中,并且不会影响现有的重复元素。 $addToSet 不保证修改集中元素的特定顺序。

标签: node.js mongodb database


【解决方案1】:

没有一次获取位置和更新的功能, 所以在你的问题中,你需要在更新之前获取位置并将其传递给查询 - 这意味着我们正在以 1:1 的比例进行操作。

其他方法是检索数据 - 执行就地更新并将完整数组集推回 mongo

【讨论】:

    【解决方案2】:

    恐怕这是不可能的。使用 $function in update 是一个古老的问题,但您唯一的方法是读取、修改和持久化数组。

    另一方面,如果您是一组嵌入文档,那么您可以使用$ positional operator$ 可用于$set 简单数组中的值,但可用于$push

    > db.test.find()
    { "_id" : ObjectId("56d9570d09e01f20e254d0f3"), "a" : [ 1, 2, 3 ] }
    > db.test.update({"_id": ObjectId("56d9570d09e01f20e254d0f3"), "a": 2},
                     {$push: {a: {$each: [2], $position: "$"}}})
    WriteResult({
        "nMatched" : 0,
        "nUpserted" : 0,
        "nModified" : 0,
        "writeError" : {
            "code" : 2,
            "errmsg" : "The value for $position must be a positive numeric value not a String"
        }
    })
    

    【讨论】:

    • 你给出的例子不起作用。您甚至在输出中包含了产生的错误 - 即“$”解析为字符串,但位置必须是整数。
    猜你喜欢
    • 1970-01-01
    • 2016-12-18
    • 2017-10-03
    • 1970-01-01
    • 2017-06-20
    • 2021-12-29
    • 2015-06-14
    • 1970-01-01
    • 2012-01-25
    相关资源
    最近更新 更多