2015-02-09 57 views
0

我想用ensureIndex和dropDups删除集合中的所有重复项,但是这种方法似乎不适用于数组。 举例来说,如果我有一个集合,看起来像这样:MongoDB:删除数组中的重复文档

{ "_id" : ObjectId("54d8f889e3fdfe0cd8b769ed"), "field1" : "a", "field2" : [ "a", "b" ] } 
{ "_id" : ObjectId("54d8f89be3fdfe0cd8b769ee"), "field1" : "a", "field2" : [ "a", "b" ] } 
{ "_id" : ObjectId("54d8f8a3e3fdfe0cd8b769ef"), "field1" : "a", "field2" : [ "a", "c" ] } 
{ "_id" : ObjectId("54d8f8abe3fdfe0cd8b769f0"), "field1" : "a", "field2" : [ "b", "a" ] } 
{ "_id" : ObjectId("54d8f8c5e3fdfe0cd8b769f1"), "field1" : "b", "field2" : [ "a", "b" ] } 

,并使用ensureIndex这样的:

> db.test.ensureIndex({field1: 1, field2: 1}, {unique: true, dropDups: true}) 

的结果将是:

> db.test.find() 
{ "_id" : ObjectId("54d8f89be3fdfe0cd8b769ee"), "field1" : "a", "field2" : [ "a", "b" ] } 
{ "_id" : ObjectId("54d8f8c5e3fdfe0cd8b769f1"), "field1" : "b", "field2" : [ "a", "b" ] } 

是否有办法要做到这一点,只有确切的重复(在我的例子集合中只有第一个或第二个条目)被删除?

+0

没有,因为数组索引[多键(http://docs.mongodb.org/manual/core/index-multikey/)。您可以使用聚合来识别重复的文档,或使用基于field1和field2的字段更新每个文档,然后在该字段上使用dropDups创建唯一索引。 – wdberkeley 2015-02-10 15:29:45

回答

0

据我所知,这个功能在阵列中不起作用。您插入数据时不能只使用$ addToSet的任何特定原因?

检查这个问题,也许帮助您MongoDB: Unique index on array element's property

+0

好吧,我想清理现有的电子邮件数据集 – 2015-02-10 10:54:57

+0

也,$ addToSet只能防止在数组中重复,我想防止可能包含数组作为字段的重复文档 – 2015-02-10 11:11:27

+0

好吧,我看到你使用默认的ObjectId。您可以尝试从字段“field1”和“field2”组成自定义“_id”。创建一个给定字段和数组的函数,返回这两个字符串组成的字符串,并赋值为“_id”。如果有重复的话会引起异常。 – gasparms 2015-02-10 13:46:00