检查并删除python MongoDB中的重复项

时间:2018-07-09 07:57:02

标签: python mongodb

我想从MongoDB中的集合中删除重复的数据。我该怎么做?

请参考以下示例以了解我的问题:

我的收藏名称和问题在此列/行中,如下所示-

{
"questionText" : "what is android ?",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1234ffa7085"),
"userId" : "102"
},

{
"questionText" : "what is android ?",
"__v" : 0,
"_id" : ObjectId("540f346c3e7fc1054ffa7086"),
"userId" : "102"
}

如何删除同一userId重复的问题?有帮助吗?

我正在使用Python和MongoDB。

2 个答案:

答案 0 :(得分:1)

重要:从MongoDB 3.x开始删除了dropDups选项,因此该解决方案仅对MongoDB 2.x及更高版本有效。没有直接替代dropDups选项。在http://stackoverflow.com/questions/30187688/mongo-3-duplicates-on-unique-index-dropdups提出的问题的答案提供了一些可能的替代方法,以删除Mongo 3.x中的重复项。

可以通过在集合上创建唯一索引并指定dropDups选项,从MongoDB集合中删除重复的记录。

假设集合包含一个名为record_id的字段,该字段唯一地标识集合中的一条记录,则用于创建唯一索引和删除重复项的命令为:

db.collection.ensureIndex( { record_id:1 }, { unique:true, dropDups:true } )

这是会话的痕迹,显示使用dropDups创建唯一索引之前和之后的集合的内容。请注意,创建索引后不再存在重复的记录。

> db.pages.find()
{ “_id” : ObjectId(“52829c886602e2c8428d1d8c”), “leaf_num” : “1”, “scan_id” : “smithsoniancont251985smit”, “height” : 3464, “width” : 2548 }
{ “_id” : ObjectId(“52829c886602e2c8428d1d8d”), “leaf_num” : “1”, “scan_id” : “smithsoniancont251985smit”, “height” : 3464, “width” : 2548 }
{ “_id” : ObjectId(“52829c886602e2c8428d1d8e”), “leaf_num” : “2”, “scan_id” : “smithsoniancont251985smit”, “height” : 3587, “width” : 2503 }
{ “_id” : ObjectId(“52829c886602e2c8428d1d8f”), “leaf_num” : “2”, “scan_id” : “smithsoniancont251985smit”, “height” : 3587, “width” : 2503 }
>
> db.pages.ensureIndex( { scan_id:1, leaf_num:1 }, { unique:true, dropDups:true } )
>
> db.pages.find()
{ “_id” : ObjectId(“52829c886602e2c8428d1d8c”), “leaf_num” : “1”, “scan_id” : “smithsoniancont251985smit”, “height” : 3464, “width” : 2548 }
{ “_id” : ObjectId(“52829c886602e2c8428d1d8e”), “leaf_num” : “2”, “scan_id” : “smithsoniancont251985smit”, “height” : 3587, “width” : 2503 }
>

答案 1 :(得分:0)

从现在起不推荐使用 dropOps。你可以使用熊猫。

  1. 从 mongodb 中选择您需要的字段
  2. 使用 pandas.DataFrame.duplicated 将除第一个之外的所有重复项标记为 True
  3. 使用它们的 _id 在集合中删除它们(标记为重复的那些)