Php 按总费用对子阵列排序

Php 按总费用对子阵列排序,php,mongodb,smarty,Php,Mongodb,Smarty,我想按总费用进行排序。 我的mongodb数据如下 { "_id" : ObjectId("534bceb303ea2ecd1de86944"), "Hotel" : [ { "0" : 0, "hotelId" : "123", "name" : "HOTEL - DEMO1", "city" : "Paris", "address1" :

我想按总费用进行排序。 我的mongodb数据如下

 {
    "_id" : ObjectId("534bceb303ea2ecd1de86944"),
    "Hotel" : [ 
        {
            "0" : 0,
            "hotelId" : "123",
            "name" : "HOTEL - DEMO1",
            "city" : "Paris",
            "address1" : "Demo -Paris ",
            "total_charges" : 1653.76,
            "propertyAvailable" : 1
        }, 
        {
            "0" : 0,
            "hotelId" : "134",
            "name" : "HOTEL - DEMO2",
            "city" : "Paris",
            "address1" : "Demo Paris ",
            "total_charges" : 1875.71,
            "propertyAvailable" : 1
        }, 
        {
            "0" : 0,
            "hotelId" : "145",
            "name" : "HOTEL - DEMO3",
            "city" : "Paris",    
            "address1" : "Demo Paris ",
            "total_charges" : 1143.18,
            "propertyAvailable" : 1
        }
    ],
    "size" : 3
}
我在PHP中尝试过类似的东西。“查找”工作正常,但排序不工作

        $dcnew = $dbnew->selectCollection($a);
        $results = $dcnew->find()->sort(array("Hotel.total_charges" => 1));
        echo "<pre>";
        foreach($results as $test) {
               $test1=$test;
        }
        echo "</pre>";
    $smarty->assign("result",$test1['Hotel']);
    $smarty->assign('template',"mongo_hotel_search_listing.tpl");
$dcnew=$dbnew->selectCollection($a);
$results=$dcnew->find()->sort(数组(“Hotel.total_charges”=>1));
回声“;
foreach($results作为$test){
$test1=$test;
}
回声“;
$smarty->assign(“结果”、$test1[‘酒店’]);
$smarty->assign('template',“mongo_hotel_search_listing.tpl”);
知道它为什么不起作用吗

谢谢

这里的问题是,您实际上是在对“顶级”文档进行排序,而不是根据需要对数组中的子文档进行排序

因此,基本查询表单(不是像PHP那样直接查询,所以更多的人会得到它)实际上是使用聚合完成的,在插入或修改数组中的元素时,您不能进行预排序:

db.collection.aggregate([
//将数组反规范化为单个文档
{“$REWIND”:“$Hotel”},
//实际排序数组文档
{“$sort”:{“Hotel.total_charges”:1},
//将所有内容恢复到原始状态,现在已排序
{“$组”:{
“\u id”:“$\u id”,
“酒店”:{“$push”:{
“hotelId”:“$Hotel.hotelId”,
“名称”:“$Hotel.name”,
“城市”:“$Hotel.city”,
“rateCurrencyCode”:“$Hotel.rateCurrencyCode”,
“地址1”:“$Hotel.address1”,
“总费用”:“$酒店。总费用”
}}
}}
])
或者将排序顺序反转为
-1
,以从高到低

结果是:

{
“_id”:ObjectId(“534bceb303ea2ecd1de86944”),
“酒店”:[
{
“hotelId”:“1033132”,
“名称”:“维多利亚皇宫酒店-演示:T2”,
“城市”:“法国巴黎”,
“汇率代码”:“SAR”,
“地址1”:“演示巴黎”,
“总费用”:1143.18
},
{
“hotelId”:“11711”,
“名称”:“凯旋门酒店-演示:T2”,
“城市”:“法国巴黎”,
“汇率代码”:“SAR”,
“地址1”:“演示-巴黎”,
“总费用”:1653.76
},
{
“hotelId”:“17421”,
“名称”:“拉斐尔酒店-演示:T2”,
“城市”:“法国巴黎特罗卡德罗”,
“汇率代码”:“SAR”,
“地址1”:“演示巴黎”,
“总费用”:1875.71
}
]
}

但是很容易翻译成PHP代码。

下面的答案适用于这个问题


不,这个坏了。我在存储数据库的Robomongo中执行了这个查询。有其他解决方案吗?@Mayuri抱歉,在清楚显示结果的同时,编辑了一些键入错误。这一个正在工作,但只显示结果{“结果”:[],“确定”:1}是否需要在$push中获取所有字段。因为我的数据没有这么多。里面有很多fields@Mayuri这适用于问题中显示的数据。这里的所有步骤都是必要的,以便在不永久更新文档的情况下按数组的某个字段对数组进行排序。这就是你的问题所在。适应您尚未显示的实际数据取决于您。但是你的问题已经得到了回答。
@Neil Lunn
谢谢你的回答。我对集合中存在的所有字段进行了编辑。
db.collection.aggregate([{ "$unwind": "$Hotel" },{ $sort : { 'Hotel.total_charges' : 1 } },{$group:{_id:'$Hotel.name',Hotel:{$push:{'total_charges':'$Hotel.total_charges'}}}}])