MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Konvertieren einiger Felder in Mongo von String in Array

Wir können $type nicht verwenden Operator, um unsere Dokumente hier zu filtern, da der Typ der Elemente in unserem Array "string" ist und wie in der Dokumentation erwähnt:

Aber glücklicherweise stellt MongoDB auch den $exists zur Verfügung Operator, der hier mit einem numerischen Array-Index verwendet werden kann.

Wie können wir diese Dokumente nun aktualisieren?

Nun, ab MongoDB-Version <=3.2 ist die einzige Option, die wir haben, mapReduce() aber schauen wir uns zuerst die andere Alternative in der kommenden Version von MongoDB an.

Ab MongoDB 3.4 können wir $project unsere Dokumente und verwenden Sie den $split -Operator, um unseren String in ein Array von Teilstrings aufzuteilen.

Beachten Sie, dass wir einen logischen benötigen, um nur die "Tags" aufzuteilen, die Zeichenfolgen sind $cond itionsverarbeitung, um nur die Werte aufzuteilen, die Zeichenfolgen sind. Die Bedingung hier ist $eq die zu true ausgewertet werden wenn der $type des Feldes ist gleich "string" . Übrigens $type hier ist neu in 3.4.

Schließlich können wir die alte Sammlung mit dem $out Betreiber der Pipeline-Stufe. Aber wir müssen die Einbeziehung anderer Felder in $project ausdrücklich spezifizieren Stufe .

db.collection.aggregate(
     [
        { "$project": { 
            "tags": { 
                "$cond": [ 
                    { "$eq": [ 
                        { "$type": "$tags" }, 
                        "string"
                    ]}, 
                    { "$split": [ "$tags", " " ] }, 
                    "$tags" 
                ] 
            } 
        }},
        { "$out": "collection" }
    ]
)

Mit mapReduce , müssen wir das Array verwenden. prototype.split() um das Array von Teilstrings in unserer Map-Funktion auszugeben . Wir müssen unsere Dokumente auch mit der Option "Abfrage" filtern. Von dort aus müssen wir das Array "results" und $set durchlaufen der neue Wert für „Tags“ mit Massenoperationen unter Verwendung des bulkWrite() Methode neu in 3.2 oder die jetzt veraltete Bulk() wenn wir auf 2.6 oder 3.0 sind, wie hier gezeigt

db.collection.mapReduce(
    function() { emit(this._id, this.tags.split(" ")); }, 
    function(key, value) {}, 
    { 
        "out": { "inline": 1 }, 
        "query": { 
            "tags.0": { "$exists": false }, 
            "tags": { "$type": 2 }
        }
    }
)['results']