2012-03-28 39 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);