我有一个像这样的mongo集合:
{
"_id" : ObjectId("4fd930ecd729f5b31ea5ad03"),
"O_ORDERKEY" : NumberLong(359),
"O_CUSTKEY" : {
"$ref" : "CUSTOMER",
"$id" : ObjectId("4f973ff37d6517e9723c4d63")
},
"O_ORDERSTATUS" : "F",
"O_TOTALPRICE" : 239998.53,
"O_ORDERDATE" : ISODate("1994-12-19T02:00:00Z"),
"O_ORDERPRIORITY" : "3-MEDIUM",
"O_CLERK" : "Clerk#000000934",
"O_SHIPPRIORITY" : 0,
"O_COMMENT" : "furiously final foxes are. regular,"
}
我希望在O_SHIPPRIORITY = 0时将所有O_TOTALPRICE相加,然后使用此命令:
db.runCommand({
mapreduce: "ORDERS7",
query: {
O_SHIPPRIORITY: 0
},
map : function Map() {
emit("sum",this.O_TOTALPRICE);
},
reduce : function Reduce(key, values) {
var sum = 0;
for (var i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
},
out: 'query'
});
db.query.find();
但我的结果是:
{ "_id" : "sum", "value" : null }
为什么值为null是错误的?
答案 0 :(得分:2)
以下对我有用,表明你的map-reduce命令没问题。 请完全按照书面形式尝试以下操作,看看是否得到相同的结果。 如果你这样做,那么你的问题就在别处,而不是你问题中描述的任何问题。 希望这会有所帮助。
orders7.js
db.ORDERS7.drop();
db.query.drop();
doc0 = {
"O_ORDERKEY" : NumberLong(359),
"O_CUSTKEY" : {
"$ref" : "CUSTOMER",
"$id" : ObjectId("4f973ff37d6517e9723c4d63")
},
"O_ORDERSTATUS" : "F",
"O_TOTALPRICE" : 239998.53,
"O_ORDERDATE" : ISODate("1994-12-19T02:00:00Z"),
"O_ORDERPRIORITY" : "3-MEDIUM",
"O_CLERK" : "Clerk#000000934",
"O_SHIPPRIORITY" : 0,
"O_COMMENT" : "furiously final foxes are. regular,"
};
doc1 = {
"O_ORDERKEY" : NumberLong(359),
"O_CUSTKEY" : {
"$ref" : "CUSTOMER",
"$id" : ObjectId("4f973ff37d6517e9723c4d63")
},
"O_ORDERSTATUS" : "F",
"O_TOTALPRICE" : 239998.53,
"O_ORDERDATE" : ISODate("1994-12-19T02:00:00Z"),
"O_ORDERPRIORITY" : "3-MEDIUM",
"O_CLERK" : "Clerk#000000934",
"O_SHIPPRIORITY" : 0,
"O_COMMENT" : "furiously final foxes are. regular,"
};
db.ORDERS7.save( doc0 );
db.ORDERS7.save( doc1 );
printjson(db.ORDERS7.find().toArray());
printjson(db.runCommand({
mapreduce: "ORDERS7",
query: {
O_SHIPPRIORITY: 0
},
map : function Map() {
emit("sum",this.O_TOTALPRICE);
},
reduce : function Reduce(key, values) {
var sum = 0;
for (var i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
},
out: 'query'
}));
printjson(db.query.find().toArray());
$ mongo xyzzy orders7.js
MongoDB shell version: 2.1.2
connecting to: xyzzy
[
{
"_id" : ObjectId("4ffa368b9ee7cfbc46a3990a"),
"O_ORDERKEY" : NumberLong(359),
"O_CUSTKEY" : DBRef("CUSTOMER", ObjectId("4f973ff37d6517e9723c4d63")),
"O_ORDERSTATUS" : "F",
"O_TOTALPRICE" : 239998.53,
"O_ORDERDATE" : ISODate("1994-12-19T02:00:00Z"),
"O_ORDERPRIORITY" : "3-MEDIUM",
"O_CLERK" : "Clerk#000000934",
"O_SHIPPRIORITY" : 0,
"O_COMMENT" : "furiously final foxes are. regular,"
},
{
"_id" : ObjectId("4ffa368b9ee7cfbc46a3990b"),
"O_ORDERKEY" : NumberLong(359),
"O_CUSTKEY" : DBRef("CUSTOMER", ObjectId("4f973ff37d6517e9723c4d63")),
"O_ORDERSTATUS" : "F",
"O_TOTALPRICE" : 239998.53,
"O_ORDERDATE" : ISODate("1994-12-19T02:00:00Z"),
"O_ORDERPRIORITY" : "3-MEDIUM",
"O_CLERK" : "Clerk#000000934",
"O_SHIPPRIORITY" : 0,
"O_COMMENT" : "furiously final foxes are. regular,"
}
]
{
"result" : "query",
"timeMillis" : 22,
"counts" : {
"input" : 2,
"emit" : 2,
"reduce" : 1,
"output" : 1
},
"ok" : 1
}
[ { "_id" : "sum", "value" : 479997.06 } ]