【问题标题】:How to delete n-th element of array in mongodb如何在mongodb中删除数组的第n个元素
【发布时间】:2011-08-29 08:38:04
【问题描述】:

例如我有这个文件:

db.test.save({
  _id: 1,
  list: [
    { key: "a" },
    { key: "b" },
    { key: "c" },
    { key: "d" },
    { key: "e" }
  ]
})

我需要从列表中删除第二个元素。

现在我分两步完成。我首先取消设置第二个列表元素,但 $unset 运算符不会删除该元素,它会将其修改为 null,然后我从列表字段中提取任何可为空的值:

db.test.update({_id: 1}, {$unset: {"list.2": 1}})
db.test.update({_id: 1}, {$pull: {list: null}})

有没有办法在一次操作中做到这一点?

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    不,很遗憾,您目前正在做的事情是最好的选择。看看这个问题:In mongoDb, how do you remove an array element by its index 链接到 Jira 来解决这个问题。

    【讨论】:

      【解决方案2】:

      如果您知道要删除的值

      db.test.update({{_id: 1},{"$pull" : {"list" : { "key" : "c"}}},false,false)
      

      更多信息在

      http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-ValueinanArray

      【讨论】:

      • 是否可以将它与findAndModify 一起使用,其中将文档的id 和数组项的存在用作查询参数?
      • 为什么使用 ¿"false,false"?谢谢!很有用!
      【解决方案3】:

      目前不是。正如There is no straight way of pulling/removing by array index 中的回答一样。

      有一个未解决的问题要求执行该操作,即使此解决方法没问题,尽管它不是原子解决方案。

      【讨论】:

        【解决方案4】:

        Mongo 4.4 开始,$function 聚合运算符允许应用自定义 javascript 函数来实现 MongoDB 查询语言不支持的行为。

        例如,为了通过删除给定索引处的元素来更新数组:

        // {
        //   "_id" : 1,
        //   "list" : [
        //     { "key" : "a" },
        //     { "key" : "b" },
        //     { "key" : "c" },
        //     { "key" : "d" },
        //     { "key" : "e" }
        //   ]
        // }
        db.collection.aggregate(
          { $set:
            { "list":
              { $function: {
                  body: function(list) { list.splice(2, 1); return list; },
                  args: ["$list"],
                  lang: "js"
              }}
            }
          }
        )
        // {
        //   "_id" : 1,
        //   "list" : [
        //     { "key" : "a" },
        //     { "key" : "b" },
        //     { "key" : "d" },
        //     { "key" : "e" }
        //   ]
        // }
        

        $function 接受 3 个参数:

        • body,即要应用的函数,其参数是要修改的数组。这里的功能只是使用 splice 删除索引 2 处的 1 个元素。
        • args,它包含来自body 函数作为参数的记录的字段。在我们的例子中是"$list"
        • lang,这是编写 body 函数的语言。目前只有js 可用。

        【讨论】:

          猜你喜欢
          • 2012-04-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-05
          • 1970-01-01
          • 2014-11-24
          • 2023-04-01
          • 1970-01-01
          相关资源
          最近更新 更多