MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Menyelesaikan array DBRef MongoDB menggunakan Mongo Native Query dan mengerjakan dokumen yang diselesaikan

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ukuran File MongoDB GridFS sangat besar untuk file yang relatif kecil

  2. Menggunakan mongodump:mongodump:perintah tidak ditemukan

  3. dukungan transaksi mongodb 4.0 untuk node.js

  4. MongoDB $substrCP

  5. Cara mengelompokkan data menggunakan template mongo