MongoDB версии 4.4 обновляет значение для поля на основе существующего значения

#node.js #mongodb #mongoose

Вопрос:

Я использую mongoose v5.13 на NodeJS

Для документа, идентификатор которого я знаю

 {
    _id: ...,
    edible: 'fruit'
}
 

Я хочу получить update этот документ и сделать это

 if (obj.edible == 'fruit') {
    obj.edible = 'apple';
} else if(obj.edible == 'vegetable') {
    obj.edible = 'carrot';
}
 

Но для этого мне нужно сначала найти, а затем обновить, следовательно, два запроса, мой вопрос в том, могу ли я сделать это за одну операцию

Ответ №1:

 db.collection.update(
{
  _id: ObjectId("61723c7378b6d3a5a02d908e")
},
[
  {
    $set: {
      edible: {
         $switch: {
              branches: [
                  { case: { $eq: [ "$edible", 'fruit' ]  }, then: "apple" },
                  { case: { $eq: [ "$edible", 'vegetable' ]  }, then: "carrot" }
              ],
              default: "$edible"
         }
      }
    }
  }
])
 

Тест здесь

Ответ №2:

Запрос

  • требуется обновление конвейера > = MongoDB 4.2
  • у вас есть только 2 варианта, которые вы могли бы использовать $cond , но я использовал $switch , чтобы вы могли добавить больше, если это необходимо

PlayMongo

 update(
{"_id": {"$eq": 1}},
[{"$set": 
    {"edible": 
      {"$switch": 
        {"branches": 
          [{"case": {"$eq": ["$edible", "fruit"]}, "then": "apple"},
            {"case": {"$eq": ["$edible", "vegetable"]}, "then": "carrot"}],
          "default": "unknown"}}}}])