MongoDB mapreduce返回null值

时间:2012-07-08 20:53:33

标签: mongodb mapreduce nosql

我有一个像这样的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是错误的?

1 个答案:

答案 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 } ]