删除 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 列表中的列表条目的主要内容,如果未能解决你的问题,请参考以下文章