0

我收集了一个类似的外观:

_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。也就是说,删除货币符号并将整个集合从 string 转换为 int。

在文档中没有任何地方我找不到如何做到这一点,我真的必须用 Python 获取每个值,删除货币符号并使用方法更新来做到这一点吗?我有将近 8,000,000 条记录,会很长。

我怎样才能用收集方法做到这一点?或者用 Python 最快的选择是什么?

4

1 回答 1

1

如果要转换整个集合,可以使用聚合管道来完成。

您需要在阶段和聚合的最后阶段使用$substrand $toInt(or$toDouble$convert任何适合您的情况将货币转换为字符串。将聚合管道的结果写入给定的集合名称。$project$out$out

但使用时要小心$out。根据官方 mongodb 文档:

创建新集合

$out如果一个新集合不存在,则该操作会在当前数据库中创建一个新集合。在聚合完成之前,该集合不可见。如果聚合失败,MongoDB 不会创建集合。

替换现有集合

如果操作指定的集合$out已经存在,那么在聚合完成后,$out阶段自动将现有集合替换为新的结果集合。具体来说,$out 操作:

  1. 创建一个临时集合。
  2. 将索引从现有集合复制到临时集合。
  3. 将文档插入临时集合。
  4. 使用 dropTarget: true 调用 db.collection.renameCollection 以将临时集合重命名为目标集合。

$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用作聚合管道的选项,因为您有很多文档,并且可能超过 16MB mongodb 限制。

不要忘记替换为实际的集合名称,并在集合中包含您需要的阶段中collection_name的所有必填字段。$project并且请先使用不同的值temporary_collection或仅通过删除 $out 阶段并检查aggregation管道的结果来仔细检查该值。

有关详细信息,请阅读官方 mongodb 文档$out$toInt$ toDouble 、$convert 、 $substrallowDiskUse

于 2019-06-29T07:44:18.480 回答