【发布时间】:2015-01-28 13:35:56
【问题描述】:
假设我有一个名为 journals 的集合,其中包含如下文档:
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 3
},
{
"article": "id2",
"d": 2
},
...
d 是一种开关,article 是一种参考。现在我想得到如下结果:
[
{
"_id": "id1",
"total": 3,
"d2": 2,
"d3": 1
},
{
"_id": "id2",
"total": 1,
"d2": 1,
"d3": 0
}
]
我正在使用 mongoose 并有一个名为 Journal 的模型。到目前为止,我得到的是……
Journal.aggregate(
{ $project: {
articleId: 1,
depth2 : { $gte:['$d', 2] },
depth3 : { $eq:['$d', 3] }
}},
{ $group: {
_id: '$article',
total: { $sum: 1 },
d2: { $sum: '$depth2'},
d3: { $sum: '$depth3'}
}
},
function (err, journal) {
console.log(journal);
}
);
导致:
[
{
"_id": "id1",
"total": 3,
"d2": 0,
"d3": 0
},
{
"_id": "id2",
"total": 1,
"d2": 0,
"d3": 0
}
]
显然这里的错误是 $eq:['$d', 3] 没有被求和,因为这会导致一个布尔值。
那么有没有更好的表达式将新的 depth2 和 depth3 字段投影到 1或 0 而不是 true 或 false?
或者是有完整更好的方法吗? :)
我想避免进行 3 次查询并预先设置匹配阶段,例如 { $match: { d: 2 } }。
【问题讨论】:
标签: node.js mongodb mongoose aggregation-framework