Đúng vậy, trường "territories"
có một mảng tham chiếu cơ sở dữ liệu
và not the actual documents
. DBRefs
là các đối tượng contain information with which we can locate the actual documents
.
Trong ví dụ trên, bạn có thể thấy rõ điều này, hãy kích hoạt truy vấn mongo bên dưới:
db.maps.find({"_id":ObjectId("542489232436657966204394")}).forEach(function(do
c){print(doc.territories[0]);})
nó sẽ in đối tượng DBRef chứ không phải bản thân tài liệu:
o/p: DBRef("territories", ObjectId("5424892224366579662042e9"))
vì vậy, '$sum': '$territories.name'
, '$sum': '$territories.area'
sẽ hiển thị cho bạn '0' vì không có trường nào như name
hoặc area
.
Vì vậy, bạn cần phải giải quyết tham chiếu này đến một tài liệu trước khi thực hiện hành động như $territories.name
Để đạt được những gì bạn muốn, bạn có thể sử dụng map()
, vì tổng hợp cũng không hỗ trợ các truy vấn phụ hỗ trợ Map-Reduce và bạn đã có một map
độc lập tài liệu, có tham chiếu đến territories
của nó .
Các bước để đạt được:
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.
Tập lệnh trình bao 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
không nên và không được sử dụng các hàm để giải quyết DBRefs
ở phía máy chủ. Xem tài liệu có nội dung gì:
Hơn nữa, reduce
ngay cả khi được sử dụng (mà không bao giờ có thể hoạt động) sẽ không bao giờ được gọi cho sự cố của bạn, vì một nhóm w.r.t "fileName"
hoặc "ObjectId"
sẽ luôn chỉ có một tài liệu trong tập dữ liệu của bạn.