sql >> データベース >  >> NoSQL >> MongoDB

Mongo NativeQueryを使用してMongoDBDBRef配列を解決し、解決されたドキュメントで作業する

    はい、確かに、フィールド"territories" データベース参照 の配列があります およびnot the actual documentsDBRefs contain information with which we can locate the actual documentsオブジェクトです。 。

    上記の例では、これをはっきりと確認できます。以下のmongoクエリを実行します。

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

    ドキュメント自体ではなく、DBRefオブジェクトを出力します:

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

    したがって、'$sum': '$territories.name''$sum': '$territories.area' nameなどのフィールドがないため、「0」が表示されます またはarea

    したがって、$territories.nameのようなことを行う前に、このドキュメントへの参照を解決する必要があります。

    目的を達成するために、map()を利用できます。 集約もMap-reduceもサブクエリをサポートしており、自己完結型のmapがすでにあるため、関数 territoriesへの参照を含むドキュメント 。

    達成するためのステップ:

    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シェルスクリプト:

    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 DBRefsを解決するために関数を使用することはできません。また、使用することもできません。 サーバー側で。ドキュメントの内容を確認してください:

    さらに、reduce グループw.r.t"fileName"が使用されている場合でも、関数が使用されても(とにかく機能することはありません)、問題に対して呼び出されることはありません。 または"ObjectId" データセットには常に1つのドキュメントしかありません。




    1. MongoDBの公式C#ドライバーを使用して「ID」で1つの「ドキュメント」を削除するにはどうすればよいですか?

    2. MongoDBポジショナルオペレーター$

    3. MongoDBを使用してフィールドの値の数を制限する

    4. 変数が設定されるのを待っているNode.JS