Php Mongodb$的返回顺序不正确

Php Mongodb$的返回顺序不正确,php,mongodb,Php,Mongodb,我有疑问 $cursor = $collection->find(array('id' =>array('$in'=>array(4,3,2,1))), array('name')); foreach($cursor as $fild) { echo $fild['name'].'<br>'; } 如果我改变数组的顺序,比如(3,2,4,1)。 返

我有疑问

  $cursor = $collection->find(array('id' =>array('$in'=>array(4,3,2,1))), array('name'));
         foreach($cursor as $fild)
                {
               echo  $fild['name'].'<br>';
                }
如果我改变数组的顺序,比如(3,2,4,1)。 返回

必须返回

Fifa 2014
Pro Evolution Soccer 2014
Star Craft 2
Need for speed: Most Wanted

我做错了什么?

本质上,这不是操作符的工作方式,对于MongoDB或任何数据库中的任何等效形式。因此,在结果中,您输入参数的顺序并不像您期望的那样得到维护

然而,为了实现这一点,您可以采取几种方法。第一种是通过创造性地使用聚合管道:

var选择=[4,2,3,1];
db.collection.aggregate([
//$match类似于标准的“查找”查询
{“$match”:{
“id”:{“$in”:选择数}
}},
//投影字段和排序字段
{“$project”:{
“_id”:0,
“名称”:1,
“订单”:{“$cond”:[
{“$eq”:[“$id”,4]},
1.
{“$cond”:[
{“$eq”:[“$id”,2]},
2.
{“$cond”:[
{“$eq”:[“$id”,3]},
3.
4.
]}
]}
]}
}},
//在生成的字段上排序
{“$sort”:{“order”:}
])
因此,通过使用运算符a,可以计算
id
的当前值,以确定要分配的排序顺序。当然,您实际上会在代码中为此条件生成管道内容,使用类似于的方法

当然,如果这看起来有点太复杂,即使你最好这样做,那么你也可以使用mapReduce来解决这个问题。但由于它在解释器中使用JavaScript代码,并且不像使用本机代码那样使用本机代码,因此运行速度会变慢:

var选择=[4,2,3,1];
db.collection.mapReduce(
函数(){
散发(
selections.indexOf(this.id),
这个名字
);            
},
函数(){},
{ 
“查询”:{“id”:{“$in”:selections},
“范围”:{“选择”:选择},
“out”:{“inline”:1}
}
)
这种方法利用了mapReduce如何对映射器中发出的键值进行排序,因此通过在数组中定位索引值,可以保持排序顺序


因此,这为您提供了两种方法,您可以使用这些方法“动态”从数组中的参数顺序生成排序顺序。

您永远不会排序…?您不能按$in
$in
排序,因为$in不能保证响应顺序。您需要在另一个字段上排序,或者在PHP代码中排序。
Need for speed: Most Wanted
Pro Evolution Soccer 2014
Fifa 2014
Star Craft 2
Fifa 2014
Pro Evolution Soccer 2014
Star Craft 2
Need for speed: Most Wanted