Node.js 如何对MongoDB集合中字段的不同值求和(利用mongoose)
假设我有一个名为journals的集合,其中包含以下文档:Node.js 如何对MongoDB集合中字段的不同值求和(利用mongoose),node.js,mongodb,mongoose,aggregation-framework,Node.js,Mongodb,Mongoose,Aggregation Framework,假设我有一个名为journals的集合,其中包含以下文档: { "article": "id1", "d": 2 }, { "article": "id1", "d": 2 }, { "article": "id1", "d": 3 }, { "article": "id2", "d": 2 }, ... [ { "_id": "id1", "total": 3, "d2": 2, "d3": 1 }, { "
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 3
},
{
"article": "id2",
"d": 2
},
...
[
{
"_id": "id1",
"total": 3,
"d2": 2,
"d3": 1
},
{
"_id": "id2",
"total": 1,
"d2": 1,
"d3": 0
}
]
其中d是一种开关,article是一个参考。现在我想得到如下结果:
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 2
},
{
"article": "id1",
"d": 3
},
{
"article": "id2",
"d": 2
},
...
[
{
"_id": "id1",
"total": 3,
"d2": 2,
"d3": 1
},
{
"_id": "id2",
"total": 1,
"d2": 1,
"d3": 0
}
]
我用的是猫鼬,有一个叫做日记的模型。到目前为止我得到的是
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}}
您可以使用它将布尔值转换为数值,但您也得到了$gte
它似乎应该是$eq
,您的文档使用article
,而您的代码使用articleId
:
Journal.aggregate([
{ $project: {
article: 1,
depth2 : { $cond: [{$eq: ['$d', 2]}, 1, 0] },
depth3 : { $cond: [{$eq: ['$d', 3]}, 1, 0] }
}},
{ $group: {
_id: '$article',
total: { $sum: 1 },
d2: { $sum: '$depth2'},
d3: { $sum: '$depth3'}
}
}
]);
输出:
{
"result" : [
{
"_id" : "id2",
"total" : 1,
"d2" : 1,
"d3" : 0
},
{
"_id" : "id1",
"total" : 3,
"d2" : 2,
"d3" : 1
}
],
"ok" : 1
}
这就像圣诞节,非常感谢!是的,关于articleId,你是对的,它发生在简化示例的过程中。至于$gte,这是故意的,因为它符合我的需要。所以d不完全是一个开关,我在这方面是在撒谎,但在这里问的问题,所以它是最好的描述我可以:)再次感谢你的时间!