2012-08-01 66 views
1

中的元素我有一个蒙戈DB收集已entried这样前n个MongoDB的集合

{ 
     _id: 
     sender: 
     receiver: 
} 

反正是有让前N在发送器和接收器/集合中不使用的MapReduce?我正在使用mongodb红宝石驱动程序。

+1

是什么让一个项目一个项目上面? – 2012-08-01 18:09:32

+0

它是每个人的不同数量。我很抱歉,我没有提到这一点。 – user1429322 2012-08-01 18:30:10

+0

如果不是mapreduce,那么去'group by'..我认为你的不是一个分片系统 – 2012-08-01 18:39:30

回答

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

+0

这是一个很好的答案,但事情是我不能使用新版本。可以告诉我如何继续使用mapreduce函数吗? – user1429322 2012-08-02 02:51:03

1

有限制参数关联d与地图缩小,但文档说,你不能在分片群集中使用它。你可以输出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 
     } 
    ]