1

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

语境:

我已经按照MongoDB 文档中的示例使用 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字段的文档,但仅包含具有$matching_id字段的文档。例如,我想仅聚合拥有{u: String, d: Date, hobby: String}type_id的文档或仅聚合具有 type 的_id文档{u: String, d: Date}

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

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

4

1 回答 1

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" },
}

然后您的匹配因为简单,甚至无需为每种类型创建不同的匹配。

于 2013-07-24T10:32:58.477 回答