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

MongoDB - $project vnořený dokument do kořenové úrovně

Pro MongoDB 3.6 a novější použijte agregační rámec s $replaceRoot potrubí, které lze použít ve spojení s $ mergeObjects operátor jako newRoot výraz.

Tento výraz

{ "$mergeObjects": ["$subdoc", "$$ROOT"] }

sloučí pole nejvyšší úrovně v dokumentu s těmi ve vložených polích subdoc, takže vaše agregovaná operace bude nakonec následující:

db.collection.aggregate([
    { "$replaceRoot": { 
        "newRoot": { 
            "$mergeObjects": [ "$subdoc", "$$ROOT" ] 
        } 
    } },
    { "$project": { "subdoc": 0 } }  
])

Jinak byste potřebovali mechanismus pro získání všech dynamických klíčů, které potřebujete k sestavení dynamického $project dokument. To je možné prostřednictvím Map-Reduce . Následující operace mapreduce vyplní samostatnou kolekci se všemi klíči jako _id hodnoty:

mr = db.runCommand({
    "mapreduce": "my_collection",
    "map" : function() {
        for (var key in this.subdoc) { emit(key, null); }
    },
    "reduce" : function(key, stuff) { return null; }, 
    "out": "my_collection" + "_keys"
})

Chcete-li získat seznam všech dynamických klíčů, spusťte odděleně na výsledné kolekci:

db[mr.result].distinct("_id")
["field2", "field3", ...]

Nyní na základě výše uvedeného seznamu můžete sestavit svůj $project agregační kanál vytvořením objektu, který bude mít své vlastnosti nastavené v rámci smyčky. Obvykle váš $project dokument bude mít tuto strukturu:

var project = {
    "$project": {
        "field1": 1,
        "field2": "$subdoc.field2",
        "field3": "$subdoc.field3"
    }
};

Takže pomocí výše uvedeného seznamu klíčů vnořených dokumentů můžete výše uvedené dynamicky vytvořit pomocí JavaScriptu reduce() metoda:

var subdocKeys = db[mr.result].distinct("_id"),
    obj = subdocKeys.reduce(function (o, v){
      o[v] = "$subdoc." + v;
      return o;
    }, { "field1": 1 }),
    project = { "$project": obj };

db.collection.aggregate([project]);



  1. Jak vytvořit vnořený index v MongoDB?

  2. Jak atomicky odstranit miliony klíčů odpovídajících vzoru pomocí čistého Redis?

  3. Jak implementovat Redis v CodeIgniter?

  4. Jak propojit MongoDB s PowerShell?