MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

MongoDB wstawia dokument lub pole inkrementacji, jeśli istnieje w tablicy

W MongoDB 4.2 i nowszych metoda aktualizacji może teraz pobrać dokument lub potok zbiorczy gdzie można zastosować następujące etapy:

  1. $addFields i jego alias $set
  2. $project i jego alias $unset
  3. $replaceRoot i jego alias $replaceWith .

Uzbrojony w powyższe, operacja aktualizacji z potoku agregacji będzie polegać na zastąpieniu tags pole, łącząc przefiltrowane tags tablica i zmapowana tablica listy wejściowej z pewnym wyszukiwaniem danych na mapie:

Na początek wyrażenie agregujące filtrujące tablicę tags używa $filter i wynika z tego:

const myTags = ["architecture", "blabladontexist"];

{ 
    "$filter": { 
        "input": "$tags",
        "cond": { 
            "$not": [
                { "$in": ["$$this.t", myTags] } 
            ] 
        }
    } 
}

który tworzy przefiltrowaną tablicę dokumentów

[  
    { "t" : "contemporary", "n" : 2 }, 
    { "t" : "creative", "n" : 1 }, 
    { "t" : "concrete", "n" : 3 }
]

Teraz druga część będzie polegała na wyprowadzeniu drugiej tablicy, która zostanie połączona z powyższym. Ta tablica wymaga $map nad myTags tablica wejściowa jako

{ 
    "$map": { 
        "input": myTags,
        "in": {
            "$cond": {
                "if": { "$in": ["$$this", "$tags.t"] },
                "then": { 
                    "t": "$$this", 
                    "n": { 
                        "$sum": [
                            { 
                                "$arrayElemAt": [
                                    "$tags.n", 
                                    { "$indexOfArray": [ "$tags.t", "$$this" ] } 
                                ] 
                            },
                            1
                        ]
                    } 
                },
                "else": { "t": "$$this", "n": 0 }
            }
        }
    } 
}

Powyższy $map zasadniczo zapętla się po tablicy wejściowej i sprawdza z każdym elementem, czy znajduje się on w tags tablica porównująca t właściwość, jeśli istnieje, to wartość n pole poddokumentu staje się jego aktualnym n wartośćwyrażona za pomocą

{ 
    "$arrayElemAt": [
        "$tags.n", 
        { "$indexOfArray": [ "$tags.t", "$$this" ] } 
    ] 
}

w przeciwnym razie dodaj domyślny dokument o wartości n równej 0.

Ogólnie rzecz biorąc, operacja aktualizacji będzie następująca

Twoja ostateczna operacja aktualizacji staje się:

const myTags = ["architecture", "blabladontexist"];

db.getCollection('coll').update(
    { "_id": "1234" },
    [
        { "$set": {
            "tags": {
                "$concatArrays": [
                    { "$filter": { 
                        "input": "$tags",
                        "cond": { "$not": [ { "$in": ["$$this.t", myTags] } ] }
                    } },
                    { "$map": { 
                        "input": myTags,
                        "in": {
                            "$cond": [
                                { "$in": ["$$this", "$tags.t"] },
                                { "t": "$$this", "n": { 
                                    "$sum": [
                                        { "$arrayElemAt": [
                                            "$tags.n", 
                                            { "$indexOfArray": [ "$tags.t", "$$this" ] } 
                                        ] },
                                        1
                                    ]
                                } },
                                { "t": "$$this", "n": 0 }
                            ]
                        }
                    } }
                ]
            }
        } }
    ],
    { "upsert": true }
);


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB findAndModify. Czy to naprawdę atomowe? Pomóż napisać zamknięte rozwiązanie aktualizacji

  2. Czy Google Cloud Functions ponownie łączy się z moim klientem MongoDB dla każdego żądania HTTP?

  3. Błąd podczas tworzenia ziarna o nazwie 'personRepository':Wywołanie metody init nie powiodło się; zagnieżdżony wyjątek to com.mongodb.util.JSONParseException:

  4. Jak dopasowywać połączone kolekcje za pomocą Laravel i MongoDB?

  5. Zapytania wewnątrz tablic Postgres JSON