1

我有一个这样的 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 }

为什么 value 为 null 有什么问题?

4

1 回答 1

2

以下对我有用,表明您的 map-reduce 命令与描述的一样好。请按照所写的内容尝试以下操作,看看是否得到相同的结果。如果你这样做了,那么你的问题就在其他地方,而不是你的问题中描述的任何东西。希望这会有所帮助。

订单7.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 } ]
于 2012-07-09T01:52:00.133 回答