2012-10-16 39 views
1

我有一个文档集合,每个文档都应该有另一个匹配的文档。 (这不是通过设计,仅用于当前操作。)但是,集合中文档数量的当前计数是奇数。有没有一种方法可以对一个不被另一个文档共享的键值进行查询?我可以根据多个文档进行查询吗?

即。如果我有这样一个集合:

{_id:'dcab0001', foo: 1, bar: 'dfgdgd'} 
{_id:'dcab0002', foo: 2, bar: 'tjhttj'} 
{_id:'dcab0003', foo: 1, bar: 'ydgdge'} 
{_id:'dcab0004', foo: 3, bar: 'jyutkf'} 
{_id:'dcab0005', foo: 3, bar: 'pofsth'} 

我可以做foo的查询将返回回文件ID为dcab0002

+1

你可以做到这一点与的Map/Reduce –

+0

你基本上是在寻找所有不同的()文件? – Sammaye

+0

据我所知,他只想要foo = 2的文件,因为它没有配对。他不想获得有一对的文件。 –

回答

3

您可以使用MapReduce或使用Aggregation Framework在MongoDB 2.2+中执行此操作。

下面是一个使用聚合框架的例子:

db.pairs.aggregate(

    // Group by values of 'foo' and count duplicates 
    { $group: { 
     _id: '$foo', 
     key: { $push: '$_id' }, 
     dupes: { $sum: 1 } 
    }}, 

    // Find the 'foo' values that are unpaired (odd number of dupes) 
    { $match: { 
     dupes: { $mod: [ 2, 1 ] } 
    }} 

    // Optionally, could add a $project to tidy up the output 
) 

输出示例:

{ 
    "result" : [ 
     { 
      "_id" : 2, 
      "key" : [ 
       "dcab0002" 
      ], 
      "dupes" : 1 
     } 
    ], 
    "ok" : 1 
} 
相关问题