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

Mise à jour MongoDBMany with Conditional

Vous voulez vraiment vouloir bulkWrite() en utilisant deux "updateMany" déclarations qu'il contient à la place. Les expressions d'agrégation ne peuvent pas être utilisées pour effectuer une "sélection alternative" dans toute forme d'instruction de mise à jour.

db.country.bulkWrite([
  { "updateMany": {
    "filter": { "pop": { "$lt": 20000000 } },
    "update": { "$set": { "country": "Small Country" } }
  }},
  { "updateMany": {
    "filter": { "pop": { "$gt": 20000000 } },
    "update": { "$set": { "country": "Large Country" } } 
  }}
])

Il y a toujours une "demande de fonctionnalité" en attente sur SERVER-6566 pour "syntaxe conditionnelle", mais ce n'est pas encore résolu. L'API "en masse" a en fait été introduite après que cette demande ait été émise, et peut vraiment être adaptée comme indiqué pour faire plus ou moins la même chose.

En utilisant également $out dans une déclaration d'agrégation, comme cela a été suggéré par ailleurs, n'est pas une option pour "mettre à jour" et ne peut écrire que dans une "nouvelle collection" pour le moment. Le changement prévu à partir de MongoDB 4.2 autoriserait $out pour réellement "mettre à jour" une collection existante, toutefois ce ne serait que lorsque la collection à mettre à jour est différente de toute autre collection utilisée dans la collecte de données à partir du pipeline d'agrégation. Donc, ce n'est pas possible utiliser un pipeline d'agrégation pour mettre à jour le même collection comme ce que vous lisez.

En bref, utilisez bulkWrite() .