为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

牛魔王的故事 2019-09-06 12:06:06

如何在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) 
    }}

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


查看完整描述

3 回答

?
浮云间

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

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

如果您的集合大小超过以上脚本将降低性能,为perfomace mongo提供mongo批量操作,使用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 queueif (counter % 1000 != 0) bulk.execute();

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



查看完整回答
反对 回复 2019-09-07
?
慕桂英3389331


您可以轻松地将字符串数据类型转换为数字数据类型。

不要忘记更改collectionName和FieldName。例如:CollectionNmae:Users&FieldName:Contactno。

试试这个查询..

db.collectionName.find().forEach( function (x) {x.FieldName = parseInt(x.FieldName);db.collectionName.save(x);});



查看完整回答
反对 回复 2019-09-07
?
慕容森

最终我用了

db.my_collection.find({moop: {$exists: true}}).forEach(function(obj) {
    obj.moop = new NumberInt(obj.moop);
    db.my_collection.save(obj);});

moop从字符串中my_collection整数


查看完整回答
反对 回复 2019-09-07

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信