【问题标题】:PHP / Mongo DB : How to sort by a specific array attributePHP / Mongo DB:如何按特定数组属性排序
【发布时间】:2012-03-28 15:48:54
【问题描述】:

我有这样的收藏:

"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({"Folders.$.Ord":1}) ;

我无法得到预期的正确订单!

有什么想法吗??我应该为此使用 Map reduce 吗?怎么样?

谢谢!

【问题讨论】:

    标签: php arrays sorting mongodb object


    【解决方案1】:

    在 mongodb 中使用 .sort() 排序仅指对文档本身进行排序,而不是对嵌套在这些文档中的数组中的值进行排序。使用此模式,您将需要在客户端获取文档并对数组中的值进行排序。

    【讨论】:

      【解决方案2】:

      谢谢。

      我发现了一个使用 map/reduce 的解决方法,它适用于这种情况。

      我把它放在这里以防其他人感兴趣:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-21
        • 2014-05-14
        • 1970-01-01
        • 2021-10-21
        • 2016-03-17
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        相关资源
        最近更新 更多