MongoDB:从多个文档中的数组中删除文档

Posted

技术标签:

【中文标题】MongoDB:从多个文档中的数组中删除文档【英文标题】:MongoDB: Delete documents from array in multiple documents 【发布时间】:2021-11-18 03:15:18 【问题描述】:

我还在了解 MongoDB 和 NoSql 数据库,我正在尝试更新一个集合。

在我的收藏中,我有多个如下所示的文档:


    "name": "store1",
    "products": [
        
            "name": "product 1",
            "reviews": [
                
                    "user": "john doe",
                    "stars": 5,
                ,
                
                    "user": "jane doe",
                    "stars": 1,
                
            ]
        ,
        
            "name": "product 2",
            "reviews": [
                
                    "user": "jane doe",
                    "stars": 3,
                
            ]
        
    ]

每个文档都有一个文档数组“products”,该数组中的每个文档都有一个文档数组“reviews”

对于集合中的每个文档,我想从“产品”中删除至少有 1 星评论的文档 = "stars": 1

因此,对于上面的示例,更新后的文档将如下所示



    "name": "store1",
    "products": [
        
            "name": "product 2",
            "reviews": [
                
                    "user": "jane doe",
                    "stars": 3,
                
            ]
        
    ]


【问题讨论】:

【参考方案1】:

您可以使用$pull 运算符来删除数组中的对象。

db.collection.update(
  "products.reviews.stars": 1
,

  "$pull": 
    "products": 
      "reviews.stars": 1
    
  
)

例如here

【讨论】:

谢谢,没想到这么简单。我试图做类似的事情,但我以一种更复杂的方式在做这件事而没有注意到。编辑:我必须使用.updateMany() 才能从多个文档中删除,因为.update() 仅从第一个文档中删除。【参考方案2】:

查询 (聚合流水线方式,需要mongodb 4.2+)

这里不需要聚合管道,但你也可以这样做 ​

Test code here

db.collection.update(,
[
 ​
   ​"$set": 
     ​"products": 
       ​"$filter": 
         ​"input": "$products",
         ​"cond": 
           ​"$not": [
             ​
               ​"$in": [
                 ​1,
                 ​"$$p.reviews.stars"
               ​]
             ​
           ​]
         ​,
         ​"as": "p"
       ​
     ​
   ​
 ​
])

因为您只有 1-5 星过滤器是空的,否则 "products.reviews.stars": 1,可以使用。 (即使你有星星的索引,它的选择性也会很低,可能会让事情变得更糟)

【讨论】:

以上是关于MongoDB:从多个文档中的数组中删除文档的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB:使用pymongo在一个集合中删除多个文档中的数组值

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

如何从 Mongo DB 中的子文档数组中删除匹配条件的子文档

从 Mongo DB 文档的数组中的对象数组中删除一个值

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它

MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它