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

时间:2011-08-29 08:38:04

标签: mongodb

例如我有一份文件

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 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

如果您知道要删除的值

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

的更多信息

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

答案 2 :(得分:0)

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

虽然这种解决方法没有问题,但仍有一个问题要求进行该操作,尽管它不是原子解决方案。

答案 3 :(得分: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,这是要应用的函数,其参数是要修改的数组。这里的功能仅在于使用拼接删除索引2处的1个元素。
  • args,其中包含body函数作为参数的记录中的字段。在我们的情况下,"$list"
  • lang,这是编写body函数的语言。当前仅js可用。