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