MongoDB通过索引从数组中移除元素

yhqotfr8  于 2022-12-18  发布在  Go
关注(0)|答案(2)|浏览(119)
{
  "_id": ...,
  "array": [
    {
      "identifier": a
    },
    {
      "identifier": b
    }
  ]
}

现在可以通过一个查询从MongoDB中移除一个数组中的元素吗?我一直在寻找答案,需要unset和pull,由mongoDB问题引导。然而,它们都很老了。(例如,我想删除元素0)

mec1mxoz

mec1mxoz1#

没有直接的方法通过数组索引来拉/移除。事实上,这是一个开放的问题http://jira.mongodb.org/browse/SERVER-1014,你可以投票支持它。
解决方法是使用$unset,然后使用$pull:
数据库列表更新({},{$未设置:{“利息.3”:1 }})数据库列表更新({},{$pull:{“利益”:null}})更新:正如在一些评论中提到的,这种方法不是原子的,如果其他客户端在两个操作之间读和/或写,可能会导致一些竞争条件。2如果我们需要原子操作,我们可以:
从数据库中读取文档更新文档并删除数组中的项替换数据库中的文档为了确保文档在我们读取后没有更改,我们可以使用更新,如果mongo docs中描述了当前模式

4nkexdtk

4nkexdtk2#

据我所知,没有一个直接的方式来做,但你可以使用另一种方式:在update查询中使用聚合阶段:
诀窍是使用$slice。检查它是如何工作的here
本例合并了两个数组,每个数组使用不同的语法,请注意文档中的内容:
$slice
返回数组的子集。
$slice具有以下两种语法形式之一:
以下语法从数组的开头或结尾返回元素:
{ $slice: [ <array>, <n> ] }
以下语法从数组中的指定位置返回元素:
{ $slice: [ <array>, <position>, <n> ] }
因此,在本例中:

  • 第一个$slice获取从开始到索引的元素。
  • 第二个$slice获取从索引到末尾的元素。

如果你把这两个数组连接起来,你会得到一个没有索引的数组。

db.collection.update({
  "_id": 1
},
[
  {
    "$set": {
      "array": {
        "$concatArrays": [
          {
            "$slice": [
              "$array",
              YOUR_INDEX
            ]
          },
          {
            "$slice": [
              "$array",
              {
                "$add": [
                  1,
                  YOUR_INDEX
                ]
              },
              {
                "$size": "$array"
              }
            ]
          }
        ]
      }
    }
  }
])

示例here

相关问题