Добавить новое поле в анализ документа MongoDB из String в Int с помощью updateMany - PullRequest
1 голос
/ 29 октября 2019

В моей коллекции MongoDB все документы содержат поле mileage, которое в настоящее время является строкой. Используя PHP, я хотел бы добавить второе поле, которое содержит тот же контент, но в виде целочисленного значения. Такие вопросы, как Как изменить тип поля? содержат пользовательский код MongoDB, который я не хочу запускать с использованием PHP, и такие вопросы, как mongodb php Strings для вывода значений получение всех документови зациклите их.

Есть ли способ использовать \MongoDB\Operation\UpdateMany для этого, так как это переведет всю работу на уровень базы данных? Я уже пробовал это для статических значений (например: добавить одну и ту же строку ко всем документам), но изо всех сил пытался получить данные для вставки из самой коллекции.

Некоторые дополнительные подсказки:

  • Я ищу чистое PHP-решение, которое не полагается на какой-либо двоичный файл, вызываемый с использованием exec. Это должно избежать установки большего количества пакетов, чем необходимо на сервере PHP
  • В настоящее время я должен использовать MongoDB в v4.0. Да, это не самая последняя версия, но я не в состоянии выполнить обновление

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Попробуйте, пожалуйста:

01) MongoDB Совокупная ссылка:

db.collectionName.aggregate(
    [
        { "$addFields": { 
            "intField": { "$toInt": "$stringFieldName" } 
        }},
        { "$out": "collectionName" }
    ]
)

02) Возможное решение PHP (Использование в качестве ссылкиhttps://www.php.net/manual/en/mongocollection.aggregate.php):

$pipeline = array(
    array(
        '$addFields' => array(
            'integerField' => array('$toInt' => '$mileage')
        )
    ),
    array(
        '$out' => 'collection'        
    ),
);
$updateResult = $collection->aggregate(pipeline);
1 голос
/ 31 октября 2019

Вы можете использовать $set, как это в 4.2, который поддерживает конвейер агрегации в обновлении.

$set stage создает mileageasint на основе предыдущего с $toInt значение

db.collection.updateMany(
   <query>,
   [{ $set: { "mileageasint":{"$toInt":"$mileage" }}}],
   ...
)

Php Solution (на примере здесь )

$updateResult = $collection->updateMany(
    [],
    [['$set' => [ 'mileageasint' =>  [ '$toInt' => '$mileage']]]]
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...