2012-03-28 9 views
1

ich diese Art der Sammlung haben:PHP/Mongo DB: Wie durch ein bestimmtes Array sortieren Attribut

"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} 
      ] 
} 

„Ordner“ Dose enthält viel mehr Elemente und spiegelt sich in dem Ordner „F_ID“ die Datei ist verfügbar, und bei welcher Reihenfolge findet in diesem Ordner "Ord" statt.

Dann möchte ich einfach alle Dateien in einem Ordner in der richtigen Reihenfolge verfügbar machen.

Aber wenn ich so etwas wie:

File.find ({ "Folders.F_id": { "$ oid": 4f72f503b8be296d78000166}}) .Sort ({ "Ordner $ Ord..": 1});

Ich kann nicht die richtige Reihenfolge erhalten, die ich erwartet habe!

Irgendeine Idee ?? Soll ich Map reduce dafür verwenden? Wie ??

Danke!

Antwort

0

Das Sortieren in mongodb mit .sort() bezieht sich nur auf das Sortieren der Dokumente selbst, nicht auf die Werte innerhalb eines Arrays, die in diesen Dokumenten verschachtelt sind. Mit diesem Schema müssen Sie das Dokument abrufen und die Werte im Array auf der Clientseite sortieren.

0

Vielen Dank.

Ich fand eine Arbeit mit Karte/reduzieren, das funktioniert gut für diesen Fall.

ich es hier, falls jemand setzen sonst interressiert:

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