MongoDB:从数组的开头删除一定数量的元素

Posted

技术标签:

【中文标题】MongoDB:从数组的开头删除一定数量的元素【英文标题】:MongoDB: Remove certain number of elements from start of an array 【发布时间】:2021-11-23 21:17:31 【问题描述】:

有没有办法从 MongoDB 中的数组开头删除一定数量的元素?

假设我不知道元素的详细信息(如 id 或 uuid),但我知道我想从它的开头删除第一个 N 个元素。有没有办法在 mongoDB 中做到这一点?我知道我可以获取整个文档并在我自己的编程语言环境中处理它,但我认为如果 mongoDB 已经实现了一种通过它自己的查询语言以原子方式实现它的方法会更好。

【问题讨论】:

【参考方案1】:

@turivishal 提到的是正确的,但是它仅在数组大小始终为 4 时才有效。为了使其适用于所有数组大小,我们应该考虑聚合中数组的大小,所以:

let n = 2;
db.collection.update(,
[
  
    $set: 
      arr: 
        $slice: [
          "$arr",
          
            $subtract: [
              -n,
              
                $size: "$arr"
              
            ]
          ,
          
        ]
      
    
  
])

Playground

【讨论】:

【参考方案2】:

有一个$pop 运算符可以从数组的顶部或底部位置删除单个元素,

还有一个关于多个弹出操作的封闭 jira 支持请求 SERVER-4798,但在评论中他们建议使用带有聚合管道选项的更新。

所以你可以从 MongoDB 4.2 开始尝试update with aggregation pipeline,

$slice,传递负数,它将从0索引开始切片元素
let n = 2;
db.collection.updateOne(
  , // your query
  [
    $set:  arr:  $slice: ["$arr", -n]  
  ]
)

Playground

【讨论】:

谢谢,但它只有在您已经知道数组的长度时才有效。正如您在操场上看到的那样,如果长度为 5 或更多,则它不起作用。

以上是关于MongoDB:从数组的开头删除一定数量的元素的主要内容,如果未能解决你的问题,请参考以下文章

从嵌套数组mongodb中删除元素

从嵌套数组mongodb中删除元素

如何从js中的数组中删除元素[元素来自mongodb] [重复]

如何从js中的数组中删除元素[元素来自mongodb] [重复]

如何从 MongoDB 文档中的双重嵌套数组中删除元素。

单击元素时从 mongodb 中删除特定的数组元素