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