MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongoose updateMany avec des valeurs différentes par identifiant unique comme un e-mail sans boucle

Vous pouvez utiliser Array.map pour façonner chaque entrée à utiliser avec une écriture en masse.

Le comportement que vous décrivez semble utiliser le email champ pour identifier chaque document.

Vous n'avez pas indiqué ce qui devrait se passer avec d'autres champs dans les documents. Si vous voulez laisser d'autres champs seuls, utilisez $set pour supprimer tous les champs non mentionnés dans les données entrantes, utilisez $replace .

Dans le shell, cela ressemble à :

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

Jetez un œil à Model.bulkWrite() pour un exemple de comment faire ceci dans la mangouste.