匹配MongoDB聚合中的复合_id字段

时间:2013-07-23 22:24:12

标签: mongodb aggregation-framework

我是MongoDB的新手,如果这个问题有明显的答案,请原谅我...

上下文

我已经跟随example in the MongoDB docs使用map-reduce实现了分层聚合。该示例使用“复合”_id字段作为map-reduce键,生成像这样的聚合文档...

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z") },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

这一切都很好。我的特定用例要求每个map步骤发出几个类似键的值。例如......

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), hobby: "wizardry" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

{
   _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), gender: "male" },
   value: {
       ts: ISODate('2010-10-10T15:01:00Z'),
       total: 254,
       count: 10,
       mean: 25.4 }
}

(值相同,但_id键略有不同。)

这也很好。

问题:

现在,我想聚合我的分层集合(视图),其中包含具有多个不同复合_id字段的文档,但仅限于包含$match_id字段的文档。例如,我想仅汇总拥有{u: String, d: Date, hobby: String}类型_id的文档或只汇总_id类型{u: String, d: Date}的文档。

我知道我可以使用$exists运算符来限制应该和不应该允许哪些_id字段,但我不想为每个字段创建单独的聚合_id(可能很多)。

是否有一种简单的方法可以将$match文档以编程方式限制为包含(或不包含)聚合中特定字段的文档?

1 个答案:

答案 0 :(得分:1)

我认为解决此问题的最佳方法是以不同方式存储您的数据。您的“_id”类型具有任意值作为键,这是您应该避免的。我可能会将文件存储为:

{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: hobby, value: "wizardry" }
}
{
    _id: { u: "rick", d: ISODate("2010-10-10T14:00:00Z"), type: gender, value: "male" },
}

然后你的比赛因为简单而且不必为每种类型创建不同的匹配。