2012-03-28 70 views
1

我有這類型的集合:PHP /蒙戈DB:如何通過特定的陣列排序屬性

"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({ 「文件夾$奧德。」:1} );

我無法獲得我期望的正確訂單!

任何想法??我應該使用Map reduce嗎?怎麼樣 ??

謝謝!

回答

0

使用.sort()排序mongodb只是指對文檔本身進行排序,而不是嵌套在這些文檔中的數組內的值。使用這種模式,您需要獲取文檔並對客戶端數組中的值進行排序。

0

謝謝。

我找到了一個解決map/reduce問題的方法,對於這種情況非常有效。

我把它放在這裏,以防別人是interrested:

// 
//$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);