MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB вмъкване на документ или увеличаване на полето, ако съществува в масива

С MongoDB 4.2 и по-нови, методът за актуализиране вече може да вземе документ или агрегиран тръбопровод където могат да се използват следните етапи:

  1. $addFields и неговия псевдоним $set
  2. $project и неговия псевдоним $unset
  3. $replaceRoot и неговия псевдоним $replaceWith .

Въоръжени с горното, вашата операция за актуализиране с обобщения конвейер ще бъде да замени tags поле чрез свързване на филтрирани tags масив и картографиран масив от входния списък с някакво търсене на данни в картата:

Като начало обобщеният израз, който филтрира масива от етикети, използва $filter и следва:

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

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

което създава филтрирания масив от документи

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

Сега втората част ще бъде извличането на другия масив, който ще бъде свързан към горния. Този масив изисква $map върху myTags входен масив като

{ 
    "$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 }
            }
        }
    } 
}

Горният $map по същество преминава през входния масив и проверява с всеки елемент дали е в tags масив, сравняващ t свойството, ако съществува, тогава стойността на n полето на поддокумента става текущият му n стойност, изразена с

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

иначе добавете документа по подразбиране с n стойност 0.

Като цяло, вашата операция по актуализиране ще бъде както следва

Последната ви операция за актуализиране става:

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. актуализацията на mongo db променя реда на обектните полета

  2. Не могат да се извлекат гео ключове, неизвестен тип GeoJSON:{ координати:[ 13.42493130000003, 52.50074619999999 ]

  3. Как да получа статус на връзката в C# MongoDB драйвер v2.0?

  4. Запитване на Mongoose за филтриране на масив и попълване на свързано съдържание

  5. Филтър Link to MongoDB