Python MongoDB:如何删除文档中的重复项?

2023-04-15 00:00:00 文档 删除 重复

在 MongoDB 中,可以使用聚合管道(Aggregation Pipeline)来删除文档中的重复项。

以下是删除名为“test”的集合中重复的“name”字段的示例代码:

from pymongo import MongoClient

# 连接 MongoDB
client = MongoClient('localhost', 27017)

# 选择数据库和集合
db = client['database_name']
collection = db['test']

# 定义聚合管道
pipeline = [
    {"$group": {"_id": "$name", "count": {"$sum": 1}, "dups": {"$addToSet": "$_id"}}},
    {"$match": {"count": {"$gt": 1}}}
]

# 执行聚合操作并删除重复项
for doc in collection.aggregate(pipeline):
    del doc["dups"][0]
    collection.remove({"_id": {"$in": doc["dups"]}})

解释一下这段代码:

首先,通过 MongoClient 连接 MongoDB,并选择数据库和集合。

然后,定义聚合管道 pipeline。pipeline 中包括两个阶段:

  1. 通过 $group 阶段将文档按照“name”字段进行分组。在分组的同时,使用 $addToSet 操作符将该组中的所有文档的 _id 加入到一个数组中,用来标记需要删除的文档。

  2. 通过 $match 阶段筛选出重复的文档组。这里使用 count 来统计每个组的文档数量,并通过 $gt 操作符将数量大于 1 的组筛选出来。

最后,通过 collection.aggregate(pipeline) 执行聚合操作,并在循环中依次处理每个重复的文档组。在处理过程中,通过 del doc["dups"][0] 将数组中的第一个元素移出标记数组,并通过 collection.remove() 删除标记数组中的所有文档。

这样,重复的文档就被删除了。另外需要注意的是,如果要删除的是字符串类型的字段,可以使用以下的管道:

pipeline = [
    {"$group": {"_id": "$name", "count": {"$sum": 1}, "dups": {"$addToSet": "$_id"}}},
    {"$match": {"count": {"$gt": 1}}},
    {"$unwind": "$dups"},
    {"$group": {"_id": "$dups", "count": {"$sum": 1}}},
    {"$match": {"count": {"$gt": 1}}}
]

for doc in collection.aggregate(pipeline):
    collection.delete_one({"_id": doc["_id"]})

其中,$unwind 操作符用于将标记数组展开,$group 和 $match 操作符用于查找重复项。最后,通过 collection.delete_one() 删除重复的文档。

相关文章