MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Giải quyết mảng MongoDB DBRef bằng cách sử dụng Mongo Native Query và làm việc trên các tài liệu đã giải quyết

Đúng vậy, trường "territories" có một mảng tham chiếu cơ sở dữ liệu 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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB không xử lý tổng hợp với allowDiskUsage:True

  2. Lỗi Node.js Lỗi:Không thể tìm thấy mô-đun 'mongoose'

  3. Làm thế nào để chỉ định phiên bản Meteor MongoDB trên cục bộ?

  4. Cách đếm các mục trong danh sách danh sách

  5. cập nhật mongodb tài liệu phù hợp không thành công