PHP / Mongodb:如何按特定数组属性排序

时间:2012-03-28 15:48:54

标签: php arrays sorting mongodb object

我有这种收藏品:

"File" 
{ 
"_id" : { "$oid" : "4f730e3bb8be296910000180"}
, "Name" : "File1.jpg"
, "Folders" : [ 
                { "F_id" : { "$oid" : "4f72f503b8be296d78000166"} , "Ord" : 1} 
                , { "F_id" : { "$oid" : "4f730eedb8be296e78000180"} , "Ord" : 3}
            ]
}
{ 
"_id" : { "$oid" : "4f730e3ab8be296978000181"} 
, "Name" : "File2.jpg"
, "Folders" : [ 
                { "F_id" : { "$oid" : "4f72f503b8be296d78000166"} , "Ord" : 2} 
                , { "F_id" : { "$oid" : "4f730eedb8be296e78000180"} , "Ord" : 2}
                , { "F_id" : { "$oid" : "4f730eedb8be296e78000132"} , "Ord" : 1}
            ] 
}
{ 
"_id" : { "$oid" : "4f730e38b8be296e78000182"}
, "Name" : "File3.jpg"
, "Folders" : [ 
                { "F_id" : { "$oid" : "4f72f503b8be296d78000166"} , "Ord" : 3} 
                , { "F_id" : { "$oid" : "4f730eedb8be296e78000180"} , "Ord" : 1}
            ]
}

“文件夹”可以包含更多元素,并反映文件可用的文件夹“F_id”,以及在此文件夹中“Ord”的顺序。

然后我想简单地按正确的顺序获取一个文件夹中的所有文件。

但是当我做的事情如下:

File.find({“Folders.F_id”:{“$ oid”:4f72f503b8be296d78000166}})。sort({“Folders。$。Ord”:1});

我无法得到我预期的正确顺序!

任何想法?我应该使用Map reduce吗?怎么??

谢谢!

2 个答案:

答案 0 :(得分:0)

使用.sort()在mongodb中进行排序仅指对文档本身进行排序,而不是对嵌套在这些文档中的数组内的值进行排序。使用此模式,您将需要获取文档并在客户端上对数组内的值进行排序。

答案 1 :(得分:0)

谢谢。

我找到了map / reduce的解决方案,这适用于这种情况。

我把它放在这里以防其他人受到关注:

//
//$folder_Id is the _id of the folder I want to list 
//map function
$mapFunc="function() {
                    var myFolder='". $folder_Id ."';
                    var obj = { // all the elements I need!
                        'Folders': {},
                        'Flds': {},
                        'Crea': {},
                        'TechInfo': {},
                        'Thumbs': {},
                        '_id': null,
                        'Order': null
                    }
                    if (this.Folders)obj.Folders = this.Folders ;
                    if (this.Flds)obj.Flds = this.Flds ;
                    if (this.Crea)obj.Crea = this.Crea ;
                    if (this.TechInfo)obj.TechInfo = this.TechInfo ;
                    if (this.Thumbs)obj.Thumbs = this.Thumbs ;
                    obj._id = this._id ;
                    if (this.Folders) {
                        for(var i=0 ; i< this.Folders.length ;i++){
                            if(this.Folders[i].F_id==myFolder){
                                obj.Order=  this.Folders[i].Ord
                                break;
                            }
                        }
                    }
                    emit( this._id , obj);
                }
        ";

//reduce function
$reduceFunc="function(key, values) {
                    values['_id']=key;
                    return  values  ;
                }
            ";


$mapReduceColl="MR_" . new MongoId();
$command = array(
    'mapreduce' => "File"
    ,'map' => $mapFunc
    ,'reduce' => $reduceFunc
    ,'query' => $query
    //,"verbose"=>true
    ,"out"=>array("replace"=>$mapReduceColl)
);
$statsInfo =  $db->MyDB->command($command);
$statsCollection =  $db->MyDB->selectCollection($statsInfo['result']);
$cursor = $statsCollection->find()->sort(array( $params["ordBy"]=>$params["ordByDir"]))->skip( $skip )->limit(  $nbreParPage );