sql >> Databáze >  >> NoSQL >> MongoDB

Vyřešení pole MongoDB DBRef pomocí Mongo Native Query a práce na vyřešených dokumentech

Ano, pole "territories" má pole odkazy na databáze a not the actual documents . DBRefs jsou objekty, které contain information with which we can locate the actual documents .

Ve výše uvedeném příkladu to můžete jasně vidět, spusťte níže uvedený mongo dotaz:

db.maps.find({"_id":ObjectId("542489232436657966204394")}).forEach(function(do
c){print(doc.territories[0]);})

vytiskne objekt DBRef spíše než samotný dokument:

o/p: DBRef("territories", ObjectId("5424892224366579662042e9"))

takže '$sum': '$territories.name' ,'$sum': '$territories.area' zobrazí '0', protože zde nejsou žádná pole jako name nebo area .

Takže musíte vyřešit tento odkaz na dokument, než uděláte něco jako $territories.name

Chcete-li dosáhnout toho, co chcete, můžete použít map() funkce, protože agregace ani Map-reduce podporují dílčí dotazy, a vy již máte samostatnou map dokument s odkazy na jeho territories .

Kroky k dosažení:

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 shell skript:

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 funkce by neměly být a nemohou být použity k řešení DBRefs na straně serveru. Podívejte se, co říká dokumentace:

Navíc reduce funkce, i když je použita (která stejně nikdy nemůže fungovat), nebude pro váš problém nikdy volána, protože skupina w.r.t "fileName" nebo "ObjectId" by měl vždy pouze jeden dokument ve vaší datové sadě.




  1. Chyba Mongodb při spuštění

  2. jarní relace redis 'Není definována žádná bean s názvem 'springSessionRepositoryFilter'

  3. jak spravovat pole _id při použití POCO s ovladačem mongodb c#

  4. MongoDB vs MySQL