我是新来的,并且问我一直面临的与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
时遇到了麻烦。
如果有人可以提供帮助,我会非常感激!
答案 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"
}
}
}
]);