MongoDB / PyMongo:如何在Map函数中使用点表示法?

时间:2011-07-08 01:57:11

标签: mongodb mapreduce pymongo

我正在计算我在每个邮政编码中记录的记录数量 在我的MongoDB中,嵌入了邮政编码;使用点符号,它位于a.res.z(一个用于地址,res用于住宅,z用于zip)。例如,这很好用:

db.NY.count({'a.res.z' : '14120'})

但是当我尝试map函数时(在python中,因为我正在使用PyMongo):

map = Code("function () {"
           "    emit(this.a.res.z, 1);"
           "}")

调用mapreduce时出现此错误:

pymongo.errors.OperationFailure: db assertion failure, assertion: 'map invoke failed: JS Error: TypeError: this.a has no properties nofile_b:0', assertionCode: 9014

点符号在顶层工作 - 例如一个点 - 但我无法让它在嵌入式系统上工作。秘密是什么?

1 个答案:

答案 0 :(得分:9)

此错误表示至少有一个您正在减少地图的对象缺少其res的{​​{1}}字段。参见:

a

您可以使用> db.NY.find({}, {_id: 0}) { "a" : { "res" : { "z" : 10011 } }, "name" : "alice" } { "a" : { "res" : { "z" : 10011 } }, "name" : "bob" } { "a" : { "res" : { "z" : 10012 } }, "name" : "carol" } > m function () { emit(this.a.res.z, 1); } > r function (key, values) { var v = 0; values.forEach(function (obj) {v += obj;}); return v; } > db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}}) { "results" : [ { "_id" : 10011, "value" : 2 }, { "_id" : 10012, "value" : 1 } ], "timeMillis" : 0, "counts" : { "input" : 3, "emit" : 3, "output" : 2 }, "ok" : 1 } > db.NY.insert({a: {}, name: "empty"}) > db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}}) { "assertion" : "map invoke failed: JS Error: TypeError: this.a.res has no properties nofile_b:1", "assertionCode" : 9014, "errmsg" : "db assertion failure", "ok" : 0 } 参数map-reduce来仅对具有您想要的字段的那些进行操作:

query

要使用PyMongo中的> db.runCommand({mapreduce: "NY", map: m, reduce: r, out: {inline: 1}, query: {"a.res.z": {$exists: true}}}) { "results" : [ { "_id" : 10011, "value" : 2 }, { "_id" : 10012, "value" : 1 } ], "timeMillis" : 1, "counts" : { "input" : 3, "emit" : 3, "output" : 2 }, "ok" : 1 } 参数,您可以将其设置为query

的关键字参数