2012-03-28 3 views
1

내가 수집 이런 종류의이 속성 :PHP : 어떻게 특정 배열로 정렬 할 수는

"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});

예상 한 올바른 주문을받을 수 없습니다.

어떤 아이디어 ?? 지도 축소를 사용해야합니까? 어떻게?

감사합니다.

답변

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