2013-04-05 47 views
1

我想创建一个查询来检查我的数据库中的哪些文档具有相同的字段值。如何定义一个查询,返回具有相同字段的所有文档

例如我得到了保存100个文档,其中2看起来是这样的:

文件1:

{ 
    "_id":32143242, 
    "specialField":12 
} 

文件2:

{ 
    "_id":787878, 
    "specialField":12 
} 

那么如何得到,如果我这两个文件不知道ID或specialField-Value?

+0

你有什么?如果你知道字段名称,我会考虑使用聚合框架。组和数。如果不是,MapReduce。 – WiredPrairie 2013-04-05 10:58:19

回答

0

这是一个可以使用MongoDB aggregation framework执行的分组操作。

样本数据

> db.foo.find().pretty(); 
{ "_id" : ObjectId("515ead9c7bb40c6a51b16a68"), "Value" : 12 } 
{ "_id" : ObjectId("515ead9d7bb40c6a51b16a69"), "Value" : 12 } 
{ "_id" : ObjectId("515ead9f7bb40c6a51b16a6a"), "Value" : 14 } 
{ "_id" : ObjectId("515eada07bb40c6a51b16a6b"), "Value" : 8 } 

采样分组操作

> db.foo.aggregate({$group : 
    { _id: "$Value", 
     count : {$sum : 1}, 
     ids: { $addToSet : "$_id" } } }); 

这将返回等于Value的群体与他们的数量和各个ID一起:

{ 
     "result" : [ 
       { 
         "_id" : 8, 
         "count" : 1, 
         "ids" : [ 
           ObjectId("515eada07bb40c6a51b16a6b") 
         ] 
       }, 
       { 
         "_id" : 14, 
         "count" : 1, 
         "ids" : [ 
           ObjectId("515ead9f7bb40c6a51b16a6a") 
         ] 
       }, 
       { 
         "_id" : 12, 
         "count" : 2, 
         "ids" : [ 
           ObjectId("515ead9d7bb40c6a51b16a69"), 
           ObjectId("515ead9c7bb40c6a51b16a68") 
         ] 
       } 
     ], 
     "ok" : 1 
} 

你应该阅读汇总框架的文档并理解其l模仿。

+0

您应该将$ addToSet更改为$ push,它会更快,并且您不能有重复的_ids,因此$ addToSet不会获得任何收益。 – 2013-04-05 15:55:27

相关问题