はい、確かに、フィールド"territories"
データベース参照
の配列があります およびnot the actual documents
。 DBRefs
contain information with which we can locate the actual documents
オブジェクトです。 。
上記の例では、これをはっきりと確認できます。以下のmongoクエリを実行します。
db.maps.find({"_id":ObjectId("542489232436657966204394")}).forEach(function(do
c){print(doc.territories[0]);})
ドキュメント自体ではなく、DBRefオブジェクトを出力します:
o/p: DBRef("territories", ObjectId("5424892224366579662042e9"))
したがって、'$sum': '$territories.name'
、'$sum': '$territories.area'
name
などのフィールドがないため、「0」が表示されます またはarea
。
したがって、$territories.name
のようなことを行う前に、このドキュメントへの参照を解決する必要があります。
目的を達成するために、map()
を利用できます。 集約もMap-reduceもサブクエリをサポートしており、自己完結型のmap
がすでにあるため、関数 territories
への参照を含むドキュメント 。
達成するためのステップ:
a) get each map
b) resolve the `DBRef`.
c) calculate the total area, and the number of territories.
d) make and return the desired structure.
Mongoシェルスクリプト:
db.maps.find().map(function(doc) {
var territory_refs = doc.territories.map(function(terr_ref) {
refName = terr_ref.$ref;
return terr_ref.$id;
});
var areaSum = 0;
db.refName.find({
"_id" : {
$in : territory_refs
}
}).forEach(function(i) {
areaSum += i.area;
});
return {
"id" : doc.fileName,
"noOfTerritories" : territory_refs.length,
"areaSum" : areaSum
};
})
o / p:
[
{
"id" : "importFile1.json",
"noOfTerritories" : 2,
"areaSum" : 1906609
},
{
"id" : "importFile2.json",
"noOfTerritories" : 1,
"areaSum" : 0
}
]
Map-Reduce
DBRefs
を解決するために関数を使用することはできません。また、使用することもできません。 サーバー側で。ドキュメントの内容を確認してください:
さらに、reduce
グループw.r.t"fileName"
が使用されている場合でも、関数が使用されても(とにかく機能することはありません)、問題に対して呼び出されることはありません。 または"ObjectId"
データセットには常に1つのドキュメントしかありません。