{ "_id": ..., "array": [ { "identifier": a }, { "identifier": b } ] }
现在可以通过一个查询从MongoDB中移除一个数组中的元素吗?我一直在寻找答案,需要unset和pull,由mongoDB问题引导。然而,它们都很老了。(例如,我想删除元素0)
mec1mxoz1#
没有直接的方法通过数组索引来拉/移除。事实上,这是一个开放的问题http://jira.mongodb.org/browse/SERVER-1014,你可以投票支持它。解决方法是使用$unset,然后使用$pull:数据库列表更新({},{$未设置:{“利息.3”:1 }})数据库列表更新({},{$pull:{“利益”:null}})更新:正如在一些评论中提到的,这种方法不是原子的,如果其他客户端在两个操作之间读和/或写,可能会导致一些竞争条件。2如果我们需要原子操作,我们可以:从数据库中读取文档更新文档并删除数组中的项替换数据库中的文档为了确保文档在我们读取后没有更改,我们可以使用更新,如果mongo docs中描述了当前模式
4nkexdtk2#
据我所知,没有一个直接的方式来做,但你可以使用另一种方式:在update查询中使用聚合阶段:诀窍是使用$slice。检查它是如何工作的here。本例合并了两个数组,每个数组使用不同的语法,请注意文档中的内容:$slice返回数组的子集。$slice具有以下两种语法形式之一:以下语法从数组的开头或结尾返回元素:{ $slice: [ <array>, <n> ] }以下语法从数组中的指定位置返回元素:{ $slice: [ <array>, <position>, <n> ] }因此,在本例中:
update
$slice
{ $slice: [ <array>, <n> ] }
{ $slice: [ <array>, <position>, <n> ] }
如果你把这两个数组连接起来,你会得到一个没有索引的数组。
db.collection.update({ "_id": 1 }, [ { "$set": { "array": { "$concatArrays": [ { "$slice": [ "$array", YOUR_INDEX ] }, { "$slice": [ "$array", { "$add": [ 1, YOUR_INDEX ] }, { "$size": "$array" } ] } ] } } } ])
示例here
2条答案
按热度按时间mec1mxoz1#
没有直接的方法通过数组索引来拉/移除。事实上,这是一个开放的问题http://jira.mongodb.org/browse/SERVER-1014,你可以投票支持它。
解决方法是使用$unset,然后使用$pull:
数据库列表更新({},{$未设置:{“利息.3”:1 }})数据库列表更新({},{$pull:{“利益”:null}})更新:正如在一些评论中提到的,这种方法不是原子的,如果其他客户端在两个操作之间读和/或写,可能会导致一些竞争条件。2如果我们需要原子操作,我们可以:
从数据库中读取文档更新文档并删除数组中的项替换数据库中的文档为了确保文档在我们读取后没有更改,我们可以使用更新,如果mongo docs中描述了当前模式
4nkexdtk2#
据我所知,没有一个直接的方式来做,但你可以使用另一种方式:在
update
查询中使用聚合阶段:诀窍是使用
$slice
。检查它是如何工作的here。本例合并了两个数组,每个数组使用不同的语法,请注意文档中的内容:
$slice
返回数组的子集。
$slice
具有以下两种语法形式之一:以下语法从数组的开头或结尾返回元素:
{ $slice: [ <array>, <n> ] }
以下语法从数组中的指定位置返回元素:
{ $slice: [ <array>, <position>, <n> ] }
因此,在本例中:
$slice
获取从开始到索引的元素。$slice
获取从索引到末尾的元素。如果你把这两个数组连接起来,你会得到一个没有索引的数组。
示例here