我有这种收藏品:
"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吗?怎么??
谢谢!
答案 0 :(得分:0)
使用.sort()在mongodb中进行排序仅指对文档本身进行排序,而不是对嵌套在这些文档中的数组内的值进行排序。使用此模式,您将需要获取文档并在客户端上对数组内的值进行排序。
答案 1 :(得分:0)
谢谢。
我找到了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 );