例如我有一份文件
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}})
我想问一下,在一次操作中是否有解决办法吗?
答案 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
可用。