MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB menyisipkan dokumen atau bidang kenaikan jika ada dalam array

Dengan MongoDB 4.2 dan yang lebih baru, metode pembaruan sekarang dapat mengambil dokumen atau pipa agregat di mana tahapan berikut dapat digunakan:

  1. $addFields dan aliasnya $set
  2. $project dan aliasnya $unset
  3. $replaceRoot dan aliasnya $replaceWith .

Berbekal hal di atas, operasi pembaruan Anda dengan pipa agregat akan menimpa tags bidang dengan menggabungkan tags yang difilter array dan array yang dipetakan dari daftar input dengan beberapa pencarian data di peta:

Untuk memulainya, ekspresi agregat yang memfilter larik tag menggunakan $filter dan berikut ini:

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

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

yang menghasilkan larik dokumen yang difilter

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

Sekarang bagian kedua adalah untuk menurunkan array lain yang akan digabungkan dengan yang di atas. Array ini memerlukan $map di atas myTags masukan larik sebagai

{ 
    "$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 di atas dasarnya mengulang array input dan memeriksa dengan setiap elemen apakah itu ada di tags array membandingkan t properti, jika ada maka nilai n bidang subdokumen menjadi n saat ini nilai yang diekspresikan dengan

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

lain tambahkan dokumen default dengan nilai n 0.

Secara keseluruhan, operasi pembaruan Anda adalah sebagai berikut

Operasi pembaruan terakhir Anda menjadi:

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. Kueri Mongo menggunakan mongoid di aplikasi Rails menyebabkan kesalahan batas waktu kursor

  2. Cara mengaktifkan konsol HTTP pada set replika MongoDB 2.6

  3. perbedaan mongodb remove() vs findOneAndDelete() vs deleteOne()

  4. Bagaimana cara menambahkan objek baru di dalam array bersarang untuk mongodb menggunakan node.js?

  5. Template MeteorJS tidak menampilkan data, tidak muncul