Как преобразовать подмножество полей во всех документах в $ToDouble?

#mongodb #type-conversion #field #multiple-columns

Вопрос:

У меня есть база данных со многими документами, структурированными следующим образом:

 Date:2021-01-02T08:00:00.000 00:00
FIT_ME44_Volume:"984385"
LT_MJ01:"0"
LT_MJ08:"0"
LT_MJ16:"-34.526024"
FIT_ME56_Volume:"0"
FIT_MJ22_Volume:"9538598"
LT_MJ26:"-61.803848"
FIT_ME52_Volume:"2734271"
LT_ME16:"0"
FIT_MJ28_Volume:"0"
LT_ME29:"2.10552"
LT_ME02:"2.005206"
LT_ME50:"8.732683"
FIT_MJ13_Volume:"0"
FIT_ME02_Volume:"1131376"
FIT_ME23_Volume:"2585415"
LT_ME03:"6.918576"
FIT_MJ08_Volume:"0"
FIT_MJ18_Volume:"0"
QQCr_Total_Plant:"5471052"
FIT_ME03_Volume:"103164"
FIT_ME51_Volume:"3587575"
LT_ME06:"24.423439"
FIT_ME46_Volume:"1619"
 

Что я хотел бы сделать, так это преобразовать все поля во всех документах, кроме Date строки, в двойное. Я могу делать это по полю за полем, но как мне сделать это оптом?

Ответ №1:

Вы можете попробовать обновить запрос конвейера агрегации, начиная с MongoDB 4.2,

  • $objectToArray преобразование корневого документа из объекта в массив ключевых значений формата объекта
  • $map для повторения цикла приведенного выше преобразованного массива
  • верните k ключ таким, какой он есть
  • $cond чтобы проверить, является ли ключ в предоставленном массиве, то не конвертировать означает игнорировать и возвращать существующее значение, вы также можете добавить имя поля, если не хотите конвертировать
  • еще $toDouble для преобразования строкового значения в двойное
  • $arrayToObject вернуться, чтобы преобразовать приведенный выше массив значений ключей объектов в формат реального объекта
  • $replaceRoot чтобы заменить приведенный выше преобразованный объект на корневой
 db.collection.updateMany(
  {},
  [{
    $replaceRoot: {
      newRoot: {
        $arrayToObject: {
          $map: {
            input: { $objectToArray: "$ROOT" },
            in: {
              k: "$this.k",
              v: {
                $cond: [
                  { $in: ["$this.k", ["Date", "_id"]] },
                  "$this.v",
                  { $toDouble: "$this.v" }
                ]
              }
            }
          }
        }
      }
    }
  }]
)
 

Игровая площадка

Комментарии:

1. Спасибо! Когда я запустил это на всей своей коллекции, я получил следующий вывод: { acknowledged: true, insertedId: null, matchedCount: 0, modifiedCount: 0, upsertedCount: 0 } Есть ли что-то конкретное, что мне нужно обновить?

2. я не знаю, почему он показывает modifiedCount: 0, просто убедитесь, что в коллекции обновлен какой-либо документ?

3. Никакие документы в коллекции не обновлялись.

4. убедитесь, что имя коллекции в запросе, в моем запросе оно db.collection заменено именем вашей коллекции.

5. Я это сделал. Все еще изменено количество: 0.