sql >> Database teknologi >  >> NoSQL >> MongoDB

Konvertering af nogle felter i Mongo fra String til Array

Vi kan ikke bruge $type operatør for at filtrere vores dokumenter her, fordi typen af ​​elementerne i vores array er "streng" og som nævnt i dokumentationen:

Men heldigvis leverer MongoDB også $exists operator, som kan bruges her med et numerisk matrixindeks.

Hvordan kan vi nu opdatere disse dokumenter?

Nå, fra MongoDB version <=3.2 er den eneste mulighed, vi har, mapReduce() men lad først se på det andet alternativ i den kommende udgivelse af MongoDB.

Fra MongoDB 3.4 kan vi $project vores dokumenter og brug $split operatør for at opdele vores streng i en række understrenge.

Bemærk, at for kun at opdele de "tags", som er streng, har vi brug for en logisk $cond ition-behandling for kun at opdele de værdier, der er streng. Betingelsen her er $eq som evalueres til sand når $type af feltet er lig med "streng" . Forresten $type her er nyt i 3.4.

Endelig kan vi overskrive den gamle samling ved hjælp af $out rørledningsstadieoperatør. Men vi skal eksplicit specificere medtagelsen af ​​et andet felt i $project scene .

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

Med mapReduce , skal vi bruge Array. prototype.split() at udsende rækken af ​​understrenge i vores kortfunktion . Vi skal også filtrere vores dokumenter ved hjælp af "forespørgsel"-indstillingen. Derfra bliver vi nødt til at iterere "resultater"-arrayet og $set den nye værdi for "tags" ved hjælp af masseoperationer ved hjælp af bulkWrite() metode ny i 3.2 eller den nu forældede Bulk() hvis vi er på 2.6 eller 3.0 som vist her.

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']



  1. Sådan bruger du GridFS til at gemme billeder ved hjælp af Node.js og Mongoose

  2. Hvad er den bedste måde at bruge Redis i et multi-threaded Rails-miljø? (Puma / Sidekiq)

  3. Den bedste måde at hoste MongoDB på DigitalOcean

  4. Mongoose JS-forespørgsler kommer alle tilbage null eller tomme