我将Mongoose与NodeJS(打字稿)一起使用。 我试图对每个位置的计数求和。输出示例:
[
{ name : "Bronx", count : 6 },
{ name : "Brooklyn", count : 6 },
{ name : "Manhattan", count : 6 },
{ name : "Queens", count : 6 }
]
当前数据模型:
data:
[
{
"news": {
"_id": "5c7615a4ef5238a6c47cbcb9",
"locations": [
{
"_id": "5c7615a4ef5238a6c47cbcc6",
"id": "1",
"name": "Manhattan",
"children": [
{
"_id": "5c7615a4ef5238a6c47cbcc8",
"count": 3
},
{
"_id": "5c7615a4ef5238a6c47cbcc7",
"count": 2
}
]
}
]
}
},
{
....
}
]
我建立的最后一个查询是:
DataModel.aggregate([
{ "$unwind": "$data.news.locations" },
{
"$group": {
"_id": "$data.news.locations",
"count": { "$sum": "$$data.news.locations.zipcodes.count" }
}
}]).exec(function(err, results){
if (err) throw err;
console.log(JSON.stringify(results, null, 4));
});
但是我是Mongoose中使用Mongoose处理句柄的新手,所以我非常感谢您的帮助。谢谢。
答案 0 :(得分:1)
您有点亲密,只是做了一些更改:
DataModel.aggregate([
// Each array needs $unwind separately
{ "$unwind": "$data" },
// And then down to the next one
{ "$unwind": "$data.news.locations" },
// Group on the grouping key
{ "$group": {
"_id": "$data.news.locations.name",
"count": { "$sum": { "$sum": "$data.news.locations.children.count" } }
}}
],(err,results) => {
// remaining handling
})
因此,由于您在数组内有数组,并且想要转到"name"
内的"locations"
属性,因此需要$unwind
。您必须分别$unwind
每个数组级别。
从技术上讲,仍然还有children
数组,但是$sum
可以用于"sum an array of values"以及“为分组键累加” 。因此,$group
中的$sum: { $sum
语句。
返回:
{ "_id" : "Manhattan", "count" : 5 }
根据问题提供的详细信息。