mongodb - 如何在mongodb中将字符串转换为数值

我正在尝试将包含数值的字符串转换为其在 MongoDB 中的聚合查询中的值。

文档示例

{
"_id": ObjectId("5522XXXXXXXXXXXX"),
   "Date": "2015-04-05",
   "PartnerID": "123456",
   "moop": "1234" 
}

我使用的聚合查询示例

{
    aggregate: 'my_collection',
    pipeline: [
         {$match: {
             Date : 
                  {$gt:'2015-04-01', 
                  $lt: '2015-04-05'
                  }}
             },
         {$group:
             {_id: "$PartnerID",
              total:{$sum:'$moop'}
             }}]}

结果在哪里

{
   "result": [
     {
       "_id": "123456",
       "total": NumberInt(0) 
    }
}

如何将字符串转换为数值?

最佳答案

MongoDB 聚合不允许更改给定字段的现有数据类型。在这种情况下,您应该创建一些编程代码来将 string 转换为 int。检查下面的代码

db.collectionName.find().forEach(function(data) {
    db.collectionName.update({
        "_id": data._id,
        "moop": data.moop
    }, {
        "$set": {
            "PartnerID": parseInt(data.PartnerID)
        }
    });
})

如果您的集合大小超过上述脚本会降低性能,对于性能 mongo 提供 mongo bulk操作,使用 mongo 批量操作也更新了数据类型

var bulk = db.collectionName.initializeOrderedBulkOp();
var counter = 0;
db.collectionName.find().forEach(function(data) {
    var updoc = {
        "$set": {}
    };
    var myKey = "PartnerID";
    updoc["$set"][myKey] = parseInt(data.PartnerID);
    // queue the update
    bulk.find({
        "_id": data._id
    }).update(updoc);
    counter++;
    // Drain and re-initialize every 1000 update statements
    if (counter % 1000 == 0) {
        bulk.execute();
        bulk = db.collectionName.initializeOrderedBulkOp();
    }
    })
    // Add the rest in the queue
if (counter % 1000 != 0) bulk.execute();

这基本上将发送到服务器的操作语句数量减少到每 1000 个排队操作仅发送一次。

https://stackoverflow.com/questions/29487351/

相关文章:

mongodb - Mongo复杂排序?

mongodb - MongoDB中count()和find().count()的区别

mongodb - mongodump 忽略一些指定的集合

mongodb - 仅当 MongoDB 文档字段不存在时,如何更新它们?

java - (MongoDB Java) $push 入数组

mongodb - 来自远程服务器的 Mongodump

mongodb - 在 MongoDB 中,如何使用 $set 更新嵌套值/嵌入文档?

javascript - 多个填充 - Mongoose js

mongodb - Mongo ids 导致可怕的 URL

mongodb - 如何获取 MongoDB 中单个索引的大小?