根据这个答案,通过索引从数组中删除一个元素意味着两个不同的更新:
db.lists.update({}, {$unset : {"interests.0" : 1 }})
db.lists.update({}, {$pull : {"interests" : null}})
这行得通...但是它引入了一些复杂性,使操作原子化并防止了竞争情况。关于这个话题有什么更新吗?
是的,不是,真的。考虑以下数组:
{ array: [ { a: "a", b: "b" }, { a:"a", b:"c" } ] }
因此,您可以使用以下语句从此处$ pull第二个元素:
db.collection.update({}, {$pull: { array: { a: "a", b: "b"} } })
这将删除匹配的文档。但是,如果在此数组上做同样的事情:
{ array: [ { a: "a", b: "b" }, { a: "a", b:"c", c: "c" }, { a:"a", b:"c" } ] }
然后将是结果:
{ array: [ { a: "a", b: "b" }] }
因此,查询匹配数组中的两个文档,并将它们都拉出。
不幸的是,看似很明显:
db.collection.update({}, {$pull: { array: { $elemMatch:{ a: "a", b: "b" } }} })
只是不会工作。真可惜。此时无法解析。
因此,故事的寓意是,如果您真的担心此类更新的并发和竞争条件.find()
,则 首先要匹配元素,然后update()
使用与整个文档匹配的语句,只要它不会部分匹配另一个文档中的其他文档即可。数组。
如果您不能这样做,那么您在问题中描述的方法是目前唯一的方法。
对此有JIRA问题,但并不十分受欢迎。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句