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

Převod některých polí v Mongo z String na Array

Nemůžeme použít $type operátor, který zde bude filtrovat naše dokumenty, protože typ prvků v našem poli je "řetězec" a jak je uvedeno v dokumentaci:

Ale naštěstí MongoDB také poskytuje $exists operátor, který zde lze použít s indexem číselného pole.

Jak můžeme nyní tyto dokumenty aktualizovat?

No, od verze MongoDB <=3.2 je jedinou možností, kterou máme, mapReduce() ale nejprve se podívejme na jinou alternativu v nadcházející verzi MongoDB.

Počínaje MongoDB 3.4 můžeme $project naše dokumenty a použijte $split operátor k rozdělení našeho řetězce na pole podřetězců.

Všimněte si, že k rozdělení pouze těch "tagů", které jsou řetězce, potřebujeme logický $cond zpracování k rozdělení pouze hodnot, které jsou řetězce. Zde je podmínka $eq které se vyhodnotí jako true při $type pole se rovná "string" . Mimochodem $type tady je novinka 3.4.

Nakonec můžeme starou kolekci přepsat pomocí $out operátor etapy potrubí. Musíme však výslovně specifikovat zahrnutí dalšího pole do $project etapa .

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

Pomocí mapReduce , musíme použít pole Array.prototype.split() k vyslání pole podřetězců v naší funkci map . Musíme také filtrovat naše dokumenty pomocí možnosti "dotaz". Odtud budeme muset iterovat pole "results" a $set novou hodnotu pro "tagy" pomocí hromadných operací pomocí bulkWrite() metoda nová ve 3.2 nebo nyní zastaralá metoda Bulk() pokud jsme na 2.6 nebo 3.0, jak je uvedeno zde.

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. Jak naplnit dílčí dokumenty vrácené po souhrnném vyhledávání v mongodb?

  2. Jaký je správný způsob správy připojení MongoDB v ASP.Net MVC?

  3. redis a watch + multi umožňuje souběžné uživatele

  4. Redis py:kdy použít fond připojení?