我試圖使用mongodb聚合查詢來連接($ lookup)兩個集合,然後區分連接數組中的所有唯一值。需要對使用mongodb聚合查詢從另一個集合加入的多個字段進行區分計數
所以我的兩個集合是這樣的: 事件 -
{
"_id" : "1",
"name" : "event1",
"objectsIds" : [ "1", "2", "3" ],
}
對象
{
"_id" : "1",
"name" : "object1",
"metaDataMap" : {
"SOURCE" : ["ABC", "DEF"],
"DESTINATION" : ["XYZ", "PDQ"],
"TYPE" : []
}
},
{
"_id" : "2",
"name" : "object2",
"metaDataMap" : {
"SOURCE" : ["RST", "LNE"],
"TYPE" : ["text"]
}
},
{
"_id" : "3",
"name" : "object3",
"metaDataMap" : {
"SOURCE" : ["NOP"],
"DESTINATION" : ["PHI", "NYC"],
"TYPE" : ["video"]
}
}
我想出來的,當我做事件$匹配_id = 1我想要的加入metaDataMap,然後清除所有這樣的鍵: 計數事件_id = 1
SOURCE : 5
DESTINATION: 4
TYPE: 2
我到目前爲止是這樣的:
db.events.aggregate([
{$match: {"_id" : id}}
,{$lookup: {"from" : "objects",
"localField" : "objectsIds",
"foreignField" : "_id",
"as" : "objectResults"}}
,{$project: {x: {$objectToArray: "$objectResults.metaDataMap"}}}
,{$unwind: "$x"}
,{$match: {"x.k": {$ne: "_id"}}}
,{$group: {_id: "$x.k", y: {$addToSet: "$x.v"}}}
,{$addFields: {size: {"$size":"$y"}} }
]);
失敗的原因是$ objectResults.metaDataMap不是一個對象它是一個數組。有關如何解決這個問題或不同方式來做我想做的事情的任何建議? 另外我不一定知道metaDataMap數組中的字段(鍵)。而且我不想統計或包含Map中可能存在或可能不存在的字段。
爲什麼不在項目之前展開onjectResults? – barbakini
工作正常!謝謝! – Deckard
樂意幫忙.. – barbakini