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

MongoDB vložte dokument nebo pole přírůstku, pokud v poli existuje

S MongoDB 4.2 a novějšími může nyní metoda aktualizace trvat dokument nebo souhrnný kanál kde lze použít následující fáze:

  1. $addFields a jeho alias $set
  2. $project a jeho alias $unset
  3. $replaceRoot a jeho alias $replaceWith .

Vyzbrojeni výše uvedeným, vaše aktualizační operace s agregovaným kanálem přepíše tags pole zřetězením filtrovaných tags pole a mapované pole seznamu vstupů s nějakým vyhledáváním dat v mapě:

Začněte tím, že agregační výraz, který filtruje pole značek, používá $filter a následuje:

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

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

který vytváří filtrované pole dokumentů

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

Nyní bude druhou částí odvození dalšího pole, které bude zřetězeno k výše uvedenému. Toto pole vyžaduje $map přes myTags vstupní pole 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 }
            }
        }
    } 
}

Výše uvedený $map v podstatě zacyklí vstupní pole a u každého prvku zkontroluje, zda je v tags pole porovnávající t vlastnost, pokud existuje, pak hodnota n pole vnořeného dokumentu se stane aktuálním n hodnota vyjádřená pomocí

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

jinak přidejte výchozí dokument s hodnotou n 0.

Celkově bude operace aktualizace následující

Vaše konečná operace aktualizace bude:

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:Závodní stav a jeden závit

  2. MongoDB min

  3. příliš mnoho otevřených souborů na serveru mgo go

  4. mongodb print json bez mezer, tj. nehezký json