Ya memang, bidang "territories"
memiliki larik referensi database
dan not the actual documents
. DBRefs
adalah objek yang contain information with which we can locate the actual documents
.
Pada contoh di atas, Anda dapat dengan jelas melihat ini, jalankan kueri mongo di bawah ini:
db.maps.find({"_id":ObjectId("542489232436657966204394")}).forEach(function(do
c){print(doc.territories[0]);})
itu akan mencetak objek DBRef daripada dokumen itu sendiri:
o/p: DBRef("territories", ObjectId("5424892224366579662042e9"))
jadi, '$sum': '$territories.name'
,'$sum': '$territories.area'
akan menampilkan '0' karena tidak ada bidang seperti name
atau area
.
Jadi, Anda perlu menyelesaikan referensi ini ke dokumen sebelum melakukan sesuatu seperti $territories.name
Untuk mencapai apa yang Anda inginkan, Anda dapat menggunakan map()
fungsi, karena agregasi atau subkueri dukungan Pengurangan Peta, dan Anda sudah memiliki map
mandiri dokumen, dengan referensi ke territories
.
Langkah-langkah untuk mencapai:
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.
Skrip Mongo shell:
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
fungsi tidak boleh dan tidak dapat digunakan untuk menyelesaikan DBRefs
di sisi server. Lihat apa yang dikatakan dokumentasi:
Selain itu, reduce
fungsi bahkan jika digunakan (yang tidak akan pernah berfungsi) tidak akan pernah dipanggil untuk masalah Anda, karena grup w.r.t "fileName"
atau "ObjectId"
akan selalu hanya memiliki satu dokumen, dalam kumpulan data Anda.