MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongoose updateMany mit unterschiedlichen Werten nach eindeutiger ID wie E-Mail ohne Schleife

Sie könnten Array.map verwenden, um jede Eingabe für die Verwendung mit einem Massenschreiben zu formen.

Das Verhalten, das Sie beschreiben, scheint die email zu verwenden Feld, um jedes Dokument zu identifizieren.

Sie haben nicht angegeben, was mit anderen Feldern in den Dokumenten geschehen soll. Wenn Sie andere Felder in Ruhe lassen möchten, verwenden Sie $set Um Felder zu entfernen, die in den eingehenden Daten nicht erwähnt werden, verwenden Sie $replace .

In der Shell sieht das so aus:

PRIMARY> db.users.find()
{ "_id" : 1, "email" : "[email protected]", "name" : "one" }
{ "_id" : 2, "email" : "[email protected]", "name" : "two" }
{ "_id" : 3, "email" : "[email protected]", "name" : "three" }

PRIMARY> let users = [     
  { email: "[email protected]", name: "oneeee" },       
  { email: "[email protected]", name: "twoooo" },       
  { email: "[email protected]", name: "three" },       
  { email: "[email protected]", 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" : "[email protected]", "name" : "oneeee" }
{ "_id" : 2, "email" : "[email protected]", "name" : "twoooo" }
{ "_id" : 3, "email" : "[email protected]", "name" : "three" }
{ "_id" : ObjectId("5f5e79ff28ee536df4c4a88e"), "email" : "[email protected]", "name" : "four" }

Sehen Sie sich Model.bulkWrite() an für ein Beispiel, wie man das in Mungo macht.