1

我有一个像这样输入的 mongo db 集合

{
      _id:
      sender:
      receiver:
}

无论如何使用/不使用mapreduce在集合中的发送者和接收者中获得前N个?我正在使用 mongodb ruby​​ 驱动程序。

4

2 回答 2

1

如果可能,我会查看 MongoDB 2.2(下一个稳定版本)中可用的新聚合框架。这是你想要完成的吗?

输入:

{_id:1, name:"Jenna"}
{_id:2, name:"Jenna"}
{_id:3, name:"Tom"}
{_id:4, name:"Tom"}
{_id:5, name:"George"}
{_id:6, name:"George"}

命令:

> db.unicorn.aggregate({$group: {_id: "$name"}},{$limit:2})

结果:

{
    "result" : [
        {
            "_id" : "George"
        },
        {
            "_id" : "Tom"
        }
    ],
    "ok" : 1
}

www.mongodb.org/display/DOCS/Aggregation+Framework

于 2012-08-01T21:11:40.607 回答
1

有一个与 map reduce 相关的限制参数,但文档说你不能将它与分片集群一起使用。您可以将 map reduce 的结果输出到新集合并对该集合执行 .find().limit(n) 查询吗?或者您是否试图避免长时间运行的聚合命令,这就是您首先对限制输出感兴趣的原因?还是我误解了你的问题?

输入:

{ "_id" : 1, "sender" : "Jenna"}
{ "_id" : 2, "sender" : "Jenna"}
{ "_id" : 3, "sender" : "George"}
{ "_id" : 4, "sender" : "George"}
{ "_id" : 5, "sender" : "Amy"}

MR函数

map = function () {
    emit(this.sender, 1);
}

reduce = function (key, values) {
    return 1;
}

输出:

"results" : [
        {
            "_id" : "Amy",
            "value" : 1
        },
        {
            "_id" : "George",
            "value" : 1
        },
        {
            "_id" : "Jenna",
            "value" : 1
        }
    ]
于 2012-08-03T06:40:49.337 回答