Возможно ли это сделать? MONGODB MON GOOSE NODE.JS - PullRequest
0 голосов
/ 02 апреля 2020

Имея в качестве примера эту коллекцию

{ _id:1 ,hotelname:"hotelxd",rooms:17}
{ _id:2 ,hotelname:"hotelxd2",rooms:187}

Я хочу добавить к этим документам новое поле, называемое размером отеля, которое зависит от количества номеров с этими условиями.

function classifyrhotel(rooms) {
if (rooms>=0 && rooms<=50) {
    return "Small hotel";
}
if (rooms>=51 && rooms<=100) {
    return "Medium hotel";
}
if (rooms>100) {
    return "Large hotel";
}

финальный БД должен выглядеть следующим образом

 { _id:1 ,hotelname:"hotelxd",rooms:17,hotelsize:"Small hotel"}
{ _id:2 ,hotelname:"hotelxd2",rooms:187,hotelsize:"Large hotel"}

1 Ответ

0 голосов
/ 02 апреля 2020

Да! Вы можете использовать конвейер агрегации с $ addFields stage и $ switch , а затем обновить вашу коллекцию с $ out stage.

Вот query:

db.collection.aggregate([
  {
    $addFields: {
      hotelsize: {
        $switch: {
          branches: [
            {
              case: {
                $lte: [
                  "$rooms",
                  50
                ]
              },
              then: "Small hotel"
            },
            {
              case: {
                $lte: [
                  "$rooms",
                  100
                ]
              },
              then: "Medium hotel"
            }
          ],
          default: "Large hotel"
        }
      }
    }
  },
  {
    $out: "collection"
  }
])

Вы можете проверить его (без $ out stage) здесь

BEWARE : этот запрос обновит всю вашу коллекцию, попробуйте это раньше (удаление этапа $ out выполнит запрос без обновления данных)

УВЕДОМЛЕНИЕ : Начиная с MongoDB 4.2, вы можете выполнять операции обновления с конвейером агрегации внутри. Эта стадия $ addFields должна сделать работу, но я не могу проверить это прямо сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...