PHP / Mongo DB: как сортировать по определенному атрибуту массива - PullRequest
1 голос
/ 28 марта 2012

У меня есть такая коллекция:

"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 ({"Папки. $. Ord": 1});

Я не могу получитьПравильный порядок я ожидал!

Есть идеи ??Должен ли я использовать карту уменьшить для этого?Как ??

Спасибо!

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Спасибо.

Я нашел способ работы с картой / уменьшением, который хорошо подходит для этого случая.

Я положил это здесь на случай, если кто-то еще заинтересован:

//
//$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 );
0 голосов
/ 28 марта 2012

Сортировка в mongodb с помощью .sort () относится только к сортировке самих документов, а не значений внутри массива, которые вложены в эти документы. С этой схемой вам нужно будет извлечь документ и отсортировать значения внутри массива на стороне клиента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...