#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.