mongodb php中的排序mapReduce结果

mongodb php中的排序mapReduce结果,php,mongodb,Php,Mongodb,我想对mapReduce函数生成的结果进行排序。 我可以看到,有一个选项可以使用 db.runCommand( { mapReduce: <collection>, map: <function>, reduce: <function>, out: <output>, query: <docu

我想对mapReduce函数生成的结果进行排序。 我可以看到,有一个选项可以使用

db.runCommand(
           {
             mapReduce: <collection>,
             map: <function>,
             reduce: <function>,
             out: <output>,
             query: <document>,
             sort: <document>,

           }
         )
现在我想检索所有帖子,还必须计算每个帖子的赞数和共享数。我无法检索每个帖子的所有喜好和分享,因为这会浪费空间。所以我选择mapReduce来计算喜欢和分享的数量。我的mapReduce操作是:

下面的代码是用php编写的:

$map=function(){ emit(this.date,{postID:this.postID,userID:this.userID,title:this.title,postimg:this.postimg,text:this.text,date:this.date,like:this.like,share:this.share,like_count:this.like.length,share_count:this.share.length})}

$reduce=function(){ }

$result=$this->db->command(array(
            'mapreduce'=>"post"
            'map'=>$map,
            'reduce'=>$reduce,
            'out'=>array('inline'=>1),
                    'sort'=>array('date'=>-1)  

        ));
结果未排序。我知道排序选项是在mapReduce之前对文档进行排序。如何对结果进行排序


有人帮助获得排序结果。

基本上,您的查询可以使用比mapReduce更好的选项来完成,因为它使用本机代码而不是JavaScript解释器,因此速度更快

2.6版及更高版本中的超级简单:

db.collection.aggregate([
{“$project”:{
“posted”:1,
“用户ID”:1,
"标题":"1,,
“文本”:1,
“img”:1,
"时间":1,,
“likes”:{“$size”:“$likes”},
“共享”:{“$size”:“$shares”},
}},
{“$sort”:{“time”:-1}
])
在以前的2.4版本中稍微多一些,仍然比mapReduce更快:

db.collection.aggregate([
{“$project”:{
“_id”:{
“postID”:“$postID”,
“userID”:“$userID”,
“标题”:“$title”,
“文本”:“$text”,
“img”:“$img”,
“时间”:“$time”,
“喜欢”:“$likes”,
“股份”:“$股份”
},
“喜欢”:1
}},
{“$REWIND”:“$likes”},
{“$组”:{
“\u id”:“$\u id”,
“喜欢”:{“$sum”:1}
“共享”:{“$first”:“$\u id.shares”}
}},
{“$unwind”:“$shares”},
{“$组”:{
“\u id”:“$\u id”,
“likes”:{“$first”:“$likes”},
“股份”:{“$sum”:1}
}},
{“$project”:{
“_id”:0,
“postID”:“$\u id.postID”,
“userID”:“$\u id.userID”,
“标题”:“$\u id.title”,
“文本”:“$\u id.text”,
“img”:“$\u id.img”,
“时间”:“$\u id.time”,
“喜欢”:“$likes”,
“股份”:“$股份”
}},
{“$sort”:{“time”:-1}
])
同样对于mapReduce,您会讨厌这是多么简单:

var mapper=function(){
散发(
{   
柜台:柜台,,
时间:这次
},
{
posted:this.posted,
userID:this.userID,
标题:这个,
postimg:this.postimg,
text:this.text,
时间:这次,
比如:这个,
分享:这个,分享,
这个,这个,长度,
share\u count:this.share.length
}
);
计数器++;
};
然后调用:

db.collection.mapReduce(
制图员,
函数(){},
{
“out”:{“inline”:1},
“排序”:{“时间”:-1},
“作用域”:{“计数器”:0}
}
)
因此,通过将“输入”排序顺序设置为所需的顺序,然后从映射器函数中的“作用域全局”中指定“计数器”的“升序”顺序作为键的前导部分,可以保留“降序”顺序


但是使用聚合方法,它更适合于您想要做的事情。

这是可以做到的,但并不明显。这有点欺骗,包括在发出的密钥中放入一些东西来表示您想要的排序顺序。您可以尝试解决这个问题,或者在这里发布一些实际数据和代码,以便获得一些指针。我知道这是可以做到的,但是如何?您能解释一下这个mapReduce是如何工作的吗?代码更容易向您展示。没有实际的选项来“排序”输出。输出总是按“键”排序“价值。但这就是诀窍,强制将键作为复合键,并按您想要的排序顺序包含前导元素。但对于传球还是有效的减少。我鼓励你发表一些东西,因为这个问题非常抽象,可能mapReduce甚至不是你特定问题的正确操作。@NeilLunn现在我已经编辑了我的问题,请检查它是否正确。所以我注意到你们实际上并没有减少,通过你们所做的,有一个比mapReduce更好的方法。但是你想要什么样的排序顺序呢?喜欢什么?分享?Post_id?在第二个聚合方法中,假设like字段为空,而$unwind未包含文档,结果中缺少like和shares字段。@vinothkumar Yes这是聚合管线的问题,因为空数组将否定所有文档内容。您可以使用$match条件排除它们,这对于您的结构来说非常困难,或者使用mapReduce方法。但在2.6版及以后的版本中,问题由$size操作符解决。
$map=function(){ emit(this.date,{postID:this.postID,userID:this.userID,title:this.title,postimg:this.postimg,text:this.text,date:this.date,like:this.like,share:this.share,like_count:this.like.length,share_count:this.share.length})}

$reduce=function(){ }

$result=$this->db->command(array(
            'mapreduce'=>"post"
            'map'=>$map,
            'reduce'=>$reduce,
            'out'=>array('inline'=>1),
                    'sort'=>array('date'=>-1)  

        ));