Mongodb 按索引从数组中删除元素
根据,按索引从数组中删除元素意味着两种不同的更新:Mongodb 按索引从数组中删除元素,mongodb,mongodb-query,Mongodb,Mongodb Query,根据,按索引从数组中删除元素意味着两种不同的更新: db.lists.update({}, {$unset : {"interests.0" : 1 }}) db.lists.update({}, {$pull : {"interests" : null}}) 这很有效。。。但它引入了一些复杂性,使操作原子化并防止竞争条件。有关于这个话题的最新消息吗?有,没有,真的。考虑下面的数组: {array:[{a:a,b:b},{a:a,b:c}] 因此,您可以使用下面的语句从这里导出第二个元素:
db.lists.update({}, {$unset : {"interests.0" : 1 }})
db.lists.update({}, {$pull : {"interests" : null}})
这很有效。。。但它引入了一些复杂性,使操作原子化并防止竞争条件。有关于这个话题的最新消息吗?有,没有,真的。考虑下面的数组:
{array:[{a:a,b:b},{a:a,b:c}]
因此,您可以使用下面的语句从这里导出第二个元素:
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()
首先找到匹配的元素,然后用一条与整个文档匹配的语句
,只要它将不也将部分匹配数组中的另一个文档
如果你不能做到这一点,那么你在问题中描述的方法是目前唯一的方法
这方面存在一个问题,但它并不是非常流行。除非它是一个cron作业,否则它可能可以在客户端处理,并且集合会在事后自动更新。在前一种情况下,也许您可以在更改完成后进行原子更新。