MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Aggiornamento di Mongoose Molti con valori diversi per ID univoco come e-mail senza loop

Puoi usare Array.map per modellare ogni input per l'uso con una scrittura di massa.

Il comportamento che stai descrivendo sembra utilizzare l'email campo per identificare ogni documento.

Non hai indicato cosa dovrebbe accadere con altri campi nei documenti. Se vuoi lasciare in pace altri campi, usa $set per rimuovere eventuali campi non menzionati nei dati in entrata, utilizzare $replace .

Nella shell questo appare come:

PRIMARY> db.users.find()
{ "_id" : 1, "email" : "example@sqldat.com", "name" : "one" }
{ "_id" : 2, "email" : "example@sqldat.com", "name" : "two" }
{ "_id" : 3, "email" : "example@sqldat.com", "name" : "three" }

PRIMARY> let users = [     
  { email: "example@sqldat.com", name: "oneeee" },       
  { email: "example@sqldat.com", name: "twoooo" },       
  { email: "example@sqldat.com", name: "three" },       
  { email: "example@sqldat.com", name: "four" }   
]

PRIMARY> let bulkUpdate = db.users.initializeUnorderedBulkOp()

PRIMARY> users.forEach(u => bulkUpdate.find({email:u.email}).upsert().update({$set:u}))

PRIMARY> bulkUpdate.execute()
BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 0,
    "nUpserted" : 1,
    "nMatched" : 3,
    "nModified" : 2,
    "nRemoved" : 0,
    "upserted" : [
        {
            "index" : 3,
            "_id" : ObjectId("5f5e79ff28ee536df4c4a88e")
        }
    ]
})

PRIMARY> db.users.find()
{ "_id" : 1, "email" : "example@sqldat.com", "name" : "oneeee" }
{ "_id" : 2, "email" : "example@sqldat.com", "name" : "twoooo" }
{ "_id" : 3, "email" : "example@sqldat.com", "name" : "three" }
{ "_id" : ObjectId("5f5e79ff28ee536df4c4a88e"), "email" : "example@sqldat.com", "name" : "four" }

Dai un'occhiata a Model.bulkWrite() per un esempio di come farlo in mangusta.