2017-01-24 66 views
0

我继承了一个包含MongoDB服务器中大量数据的项目。我正在写一些查询,并遇到了一个相当烦人的问题。我需要找到我们称为ID的唯一值的数量。问题是,根据数据的来源,它们可能出现在两个不同的点上。MongoDB:从两个不同的表中检索不同的计数

例如,表可以是这个样子:

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: undefined 
    } 
} 

{ 
    foo: { 
    ID: undefined 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

{ 
    foo: { 
    ID: "ABC123" 
    }, 
    bar: { 
    ID: "ABC123" 
    } 
} 

可惜我不能再模型在这个数据点。我对MongoDB的知识相当有限。我想知道是否有一种方法使用聚合将它们连接在一起,这样我就可以将所有ID集合到一个文档中,因此它们都是唯一的。对一个或另一个进行分组是相当简单的,但将两个分组都会给我重复。

回答

5

您可以使用$project,然后$group,然后$addToSet

db.c.aggregate([ 
{ 
    $project : { 
     _id : 0, 
     IDS : ["$foo.ID", "$bar.ID"] 
    } 
}, 
{ 
    $unwind : "$IDS" 
}, 
{ 
    $group : { 
     _id : 1, 
     distinctIds : { 
      $addToSet : "$IDS" 
     } 
    } 
} 
]) 
2

你可以尝试$group让每个barfoo DOC ID's到一个数组中,并运行他们通过$setUnion在之前的分组ID's得到明显。

db.collection.aggregate({ 
    $group: { 
     "_id": null, 
     "ID": { 
      $addToSet: { 
       "foo_id": "$foo.ID", 
       "bar_id": "$bar.ID" 
      } 
     } 
    } 
}, { 
    $project: { 
     "ID": { 
      $setUnion: ["$ID.foo_id", "$ID.bar_id"] 
     }, 
     _id: 0 
    } 
}) 
+0

这也适用。谢谢。 – DeeV

相关问题