2012-02-14 43 views
1

我是NoSQL的新手,非常抱歉,如果这是非常基本的。比方说,我有以下的集合:Dedupe MongoDB Collection

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

我想运行在任何匹配的“重复数据删除”查询:查询运行

所以经过
{ 
    a: 1, 
    b: 2 
    ... (any other properties are ignored) ... 
}, 

,或者在下面剩余的收集就可以了:

{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

OR

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

只要只有一个文档剩余== 1和b == 2。

回答

6

如果你总是希望确保只有一个文件有任何给定的ab组合,您可以在ab使用唯一索引。当创建索引,你可以给dropDups选项,这将删除所有,但一个重复:

db.collection.ensureIndex({a: 1, b: 1}, {unique: true, dropDups: true}) 
+0

该死的,忘记了:) – 2012-02-14 01:45:20

+0

这不适用于所有可能的情况下(例如,{a:{$ in:[1,2]}}),但是唯一的单一命令解决方案(尽管如果您实际上不需要索引,您可能希望直接删除索引) – 2012-02-14 11:58:10

+0

这是否适用于嵌入式文档? – Jeff 2014-04-04 03:25:24

0

我不知道会就地更新您的集合中的任何命令,但你肯定能行通过临时存储。

  1. 组文档通过您的标准(领域ab
  2. 对于每个组从中挑选任何文件。将它保存到临时集合tmp。放弃组中的其他人。
  3. tmp中的文档覆盖原始集合。

您可以使用MapReduce或即将到来的Aggregation Framework(目前位于不稳定分支)执行此操作。

我决定不在这里写代码,因为它需要学习离开你的快乐。 :)