如何在MongoDB中删除数组的第n个元素

19
例如,我有这个文档:
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}})

有没有一种方法可以在一次操作中完成这个任务?

4个回答

8

3

这个可以用在findAndModify中吗?其中文档的ID和数组项的存在作为查询参数使用了吗? - raffian
为什么要使用"false,false"?谢谢!非常有用! - Juan Camilo Camacho Beltrán

0

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 的位置删除一个元素。
  • args,其中包含记录中 body 函数作为参数所需的字段。在我们的例子中是 "$list"
  • lang,这是编写 body 函数的语言。目前仅支持 js

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接