![](/img/trans.png)
[英]MongoDB $lookup operation inside collection.aggregate not matching ObjectIDs that are equal to each other
[英]MongoDB (mongoose) aggregate count instances of specific ObjectIDs in collection
假設我的模式看起來像這樣:
{
field: [{
subDoc: ObjectId,
...
}],
...
}
我有一些ObjectIds(用戶輸入)列表,我如何得到這些特定ObjectIds的計數? 例如,如果我有這樣的數據:
[
{field: [ {subDoc: 123}, {subDoc: 234} ]},
{field: [ {subDoc: 234}, {subDoc: 345} ]},
{field: [ {subDoc: 123}, {subDoc: 345}, {subDoc: 456} ]}
]
與用戶給定ID列表是123, 234, 345
,我需要得到一個數給定的ID,所以結果是近似的:
{
123: 2,
234: 2,
345: 2
}
最好的方法是什么?
聚合框架本身如果不按照你提出的輸出方式動態命名鍵,那真的是一件好事。 但你可以像這樣做一個查詢:
db.collection.aggregate([
// Match documents that contain the elements
{ "$match": {
"field.subDoc": { "$in": [123,234,345] }
}},
// De-normalize the array field content
{ "$unwind": "$field" },
// Match just the elements you want
{ "$match": {
"field.subDoc": { "$in": [123,234,345] }
}},
// Count by the element as a key
{ "$group": {
"_id": "$field.subDoc",
"count": { "$sum": 1 }
}}
])
這給你輸出如下:
{ "_id" : 345, "count" : 2 }
{ "_id" : 234, "count" : 2 }
{ "_id" : 123, "count" : 2 }
但是,如果您真的想要堅持這一點,那么您在查詢中指定了所需的“鍵”,因此您可以形成如下管道:
db.collection.aggregate([
{ "$match": {
"field.subDoc": { "$in": [123,234,345] }
}},
{ "$unwind": "$field" },
{ "$match": {
"field.subDoc": { "$in": [123,234,345] }
}},
{ "$group": {
"_id": "$field.subDoc",
"count": { "$sum": 1 }
}},
{ "$group": {
"_id": null,
"123": {
"$max": {
"$cond": [
{ "$eq": [ "$_id", 123 ] },
"$count",
0
]
}
},
"234": {
"$max": {
"$cond": [
{ "$eq": [ "$_id", 234 ] },
"$count",
0
]
}
},
"345": {
"$max": {
"$cond": [
{ "$eq": [ "$_id", 345 ] },
"$count",
0
]
}
}
}}
])
通過處理參數列表,在代碼中構造最后一個階段是一件相對簡單的事情:
var list = [123,234,345];
var group2 = { "$group": { "_id": null } };
list.forEach(function(id) {
group2["$group"][id] = {
"$max": {
"$cond": [
{ "$eq": [ "$_id", id ] },
"$count",
0
]
}
};
});
而這或多或少都是你想要的。
{
"_id" : null,
"123" : 2,
"234" : 2,
"345" : 2
}
不完全是你要求的,但它可以給你一個想法:
db.test.aggregate([
{
$unwind: '$field'
},
{
$group: {
_id: {
subDoc: '$field.subDoc'
},
count: {
$sum: 1
}
}
},
{
$project: {
subDoc: '$subDoc.subDoc',
count: '$count'
}
}
]);
輸出:
{
"result": [
{
"_id": {
"subDoc": 456
},
"count": 1
},
{
"_id": {
"subDoc": 345
},
"count": 2
},
{
"_id": {
"subDoc": 234
},
"count": 2
},
{
"_id": {
"subDoc": 123
},
"count": 2
}
],
"ok": 1
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.