我是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
文档以编程方式限制为包含(或不包含)聚合中特定字段的文档?
答案 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" },
}
然后你的比赛因为简单而且不必为每种类型创建不同的匹配。