删除 pyMongo 列表中的列表条目

Posted

技术标签:

【中文标题】删除 pyMongo 列表中的列表条目【英文标题】:Removing a list entry in a list in pyMongo 【发布时间】:2020-11-17 14:12:49 【问题描述】:

我有一个包含如下对象的数据库集合:


    "_id": ObjectId("something"),
    "name_lower": "total",
    "name": "Total",
    "mounts": [
        [
            "mount1",
            "instance1"
        ],
        [
            "mount2",
            "instance1"
        ],
        [
            "mount1",
            "instance2"
        ],
        [
            "mount2",
            "instance2"
        ]
    ]

假设我想删除具有实例 instance2 的每个挂载,我该怎么做呢?找了好久。

【问题讨论】:

【参考方案1】:

你可以这样做

[
  
    $unwind: "$mounts"
  ,
  
    $match: 
      "mounts": 
        $ne: "instance2"
      
    
  ,
  
    $group: 
      _id: "$_id",
      name: 
        $first: "$name"
      ,
      mounts: 
        $push: "$mounts"
      
    
  
]

工作Mongo playground

【讨论】:

【参考方案2】:

此答案基于@varman 答案,但更 Pythonic 和高效。

第一阶段应该是一个$match 条件来过滤掉不需要更新的文档。

由于mounts键由嵌套数组组成,我们必须$unwind它,这样我们才能删除需要删除的数组元素。

我们必须再次应用$match 条件来过滤掉必须删除的元素。

最后,我们要通过_id键来$group管道,这样前一阶段得到$unwind的文档将被组合成一个文档。

from pymongo import MongoClient


client = MongoClient("<URI-String>")
col = client["<DB-Name"]["<Collection-Name>"]


count = 0
for cursor in col.aggregate([

        "$match": 
            "mounts": "$ne": "instance2"
        
    ,
    
        "$unwind": "$mounts"
    ,
    
        "$match": 
            "mounts": "$ne": "instance2"
        
    ,
    
        "$group": 
            "_id": "$_id",
            "newMounts": 
                "$push": "$mounts"
            
        
    ,
]):
    # print(cursor)
    col.update_one(
        "_id": cursor["_id"]
    , 
        "$set": 
            "mounts": cursor["newMounts"]
        
    )

    count += 1
    print("\r", count, end="")

print("\n\nDone!!!")


【讨论】:

感谢您的回答!我已经实现了这个并且效果很好。但是您能否解释一下这个问题对其他人的聚合作用? 感谢您的建议。添加了相同的解释

以上是关于删除 pyMongo 列表中的列表条目的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyMongo 和 MongoEngine 从 MongoDb 列表中删除对象及其索引?

python 从有序列表中删除不在无序列表中的条目

如何在列表视图文件浏览器中删除条目和视频文件?

如何构建“添加/删除程序”列表?

iOS开发中的条目列表

删除列表列表中的第一项 - 制作副本而不是就地修改