Как преобразовать строку с символами в int для всей коллекции? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть коллекция похожего вида:

_id:5d0fe0dcfd8ea94eb4633222
Category:"Stripveiling (Nederlands)"
Category url:"https://www.catawiki.nl/a/11-stripveiling-nederlands"
Lot title:"Erwin Sels (Ersel) - Originele pagina"
Seller name:"Stripwereld"
Seller country:"Nederland"
Bids count:21
Winning bid:"€ 135"
Bid amount:"Closed"
Lot image:"https://assets.catawiki.nl/assets/2011/11/17/7/4/c/74c53540-f390-012e-..."

Мне нужно изменить поле «Выигрышная ставка» на int.То есть удалите знак валюты и преобразуйте строку в int для всей коллекции.

Нигде в документации я не смог найти, как это сделать, действительно ли мне нужно принимать все значения с помощью Python, удалитьсимвол валюты и использовать метод обновления, чтобы сделать это?У меня есть почти 8 000 000 записей, это будет долго.

Как я могу сделать это с помощью метода сбора?Или какой самый быстрый вариант сделать это с Python?

1 Ответ

1 голос
/ 29 июня 2019

Если вы хотите преобразовать всю коллекцию, вы можете сделать это с помощью конвейера агрегации.

Вам необходимо преобразовать валюту в строку, используя $substr и $toInt( или $toDouble, или $convert, в зависимости от вашего случая) на этапе $project и $out в качестве последнего этапа.агрегации.$out записывает результат конвейера агрегации в заданное имя коллекции.

Но будьте осторожны при использовании $out.Согласно официальной документации mongodb:

Создать новую коллекцию

Операция $out создает новую коллекцию в текущей базе данных, если она еще не существует.Коллекция не видна, пока агрегация не завершится.В случае сбоя агрегации MongoDB не создает коллекцию.

Заменить существующую коллекцию

Если коллекция, указанная в операции $out, уже существует, то по завершенииагрегация, этап $out атомарно заменяет существующую коллекцию новой коллекцией результатов.В частности, операция $out:

  1. Создает временную коллекцию.
  2. Копирует индексы из существующей коллекции во временную коллекцию.
  3. Вставляет документы в временную коллекцию.
  4. Вызывает db.collection.renameCollection с dropTarget: true, чтобы переименовать временную коллекцию в целевую коллекцию.

Операция $out не изменяет индексы, которые существовали в предыдущемколлекция.В случае сбоя агрегации операция $out не вносит изменений в уже существующую коллекцию.

Попробуйте выполнить следующее:

db.collection_name.aggregate([
    {
        $project: {
            category : "$category",
            category_name : "$category_name",
            lot_title : "$lot_title",
            seller_name : "$seller_name",
            seller_country : "$seller_country",
            bid_count : "$bid_count",
            winning_bid : { $toInt : {$substr : ["$winning_bid",2,-1]}},
            bid_amount : "$bid_amount",
            lot_image : "$lot_image"
        }
    },{
        $out : "collection_name"
    }
])

, возможно, вам придется использовать allowDiskUse : true в качествевозможность агрегации конвейера, так как у вас много документов, и он может превысить предел в 16 МБ mongodb.

Не забудьте заменить collection_name на фактическое имя коллекции и включить все необходимыеполе на этапе $project, которое вам нужно в коллекции.И, пожалуйста, дважды проверьте значение сначала с другим temporary_collection или просто удалив этап $ out и проверив результат aggregation pipe.

Для получения подробной информации прочитайте официальную документацию mongodb $ out , $ toInt , $ toDouble , $ convert, $ substr и allowDiskUse .

...