2012-03-28 6 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"が実行されるかを示します。

次に、1つのフォルダ内のすべてのファイルを正しい順序で入手することができます。

しかし、私はのような何かを行うとき:

File.find({ "Folders.F_id":{ "$のOID":4f72f503b8be296d78000166}}).sort({ "フォルダ$オードを。。":1} );

私は正しい注文を得ることができません!

それにMap reduceを使うべきですか?どうやって ??

ありがとうございます!

答えて

0

mongodbを.sort()でソートすることは、ドキュメント内でネストされた配列内の値ではなく、ドキュメント自体のソートのみを意味します。このスキーマでは、ドキュメントをフェッチし、クライアント側の配列内の値をソートする必要があります。

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); 
関連する問題