MongoDB:使用map-reduce将字符串更改为整数

时间:2015-05-05 15:48:03

标签: string mongodb mapreduce integer

我是新来的,并且问我一直面临的与mongodb有关的问题。

以下是一条记录看起来如何的示例结构。

{
    "_id" : {
             "id" : "lk23j",
             "language" : "English"
            },
   "class" : "test",
   "title" : {
              "duration" : "34"
              "year" : "1991"
             }
}

有几个这样的记录,我想在所有记录中记录持续时间的总和。根据我的理解,聚合不起作用,因为title.duration字段需要转换为整数,因此取总和返回NaN(不是数字)。因此我需要转换然后使用map-reduce获取总和,这将允许parseInt(在javascript中)。

http://blog.physalix.com/datas-manipulation-in-mongodb-rename-field-change-type-add-sub-document/开始,我无法将title.duration更改为整数:

db.members.find().forEach( function (x) {x.title.duration= parseInt(x.title.duration);});

上面的查询提出了一个

  

“无法读取未定义的属性'持续时间'。

我经常收到错误

  

assinment中的左侧无效“for”title.duration“= parseInt(”title.duration“);

我尝试过使用map-reduce的类似方法,但没有成功。我在引用数据title.duration时遇到了麻烦。

如果有人可以提供帮助,我会非常感激!

1 个答案:

答案 0 :(得分:1)

您可以尝试过滤您的集合,查找title.duration字段属于字符串类型且存在的文档,然后使用 {{迭代 find() 光标1}} 方法,进行转换并保存更新的文档。

让我们采用最小的测试用例并将以下测试文档插入测试集合中:

forEach

然后可以如下进行如上所述的转换操作:

db.test.insert([
    {
        "_id" : {
            "id" : "lk23j",
            "language" : "English"
        },
        "class" : "test",
        "title" : {
            "duration" : "34",
            "year" : "1991"
        }
    },
    {
        "_id" : {
            "id" : "abc",
            "language" : "French"
        },
        "class" : "foo"
    },
    {
        "_id" : {
            "id" : "def",
            "language" : "German"
        },
        "class" : "bar",
        "title" : {
            "year" : "1991"
        }
    },
    {
        "_id" : {
            "id" : "erb42",
            "language" : "Shona"
        },
        "class" : "xyz",
        "title" : {
            "duration" : null,
            "year" : "1993"
        }
    },
    {
        "_id" : {
            "id" : "urn321",
            "language" : "Latin"
        },
        "class" : "bar",
        "title" : {
            "duration" : "",
            "year" : "1999"
        }
    }
])

转换后,您可以使用聚合框架计算所有文档的db.test.find({ "title.duration": { "$type" : 2 } }).forEach(function (doc){ doc.title.duration = parseInt(doc.title.duration) || 0; db.test.save(doc); }); 字段的总和,如下所示:

title.duration

结果:

db.test.aggregate([
    {
        "$group": {
            "_id": null,
            "total_duration": {
                "$sum": "$title.duration"
            }
        }
    }
]);