2015-03-02 57 views
0

我有MongoDB的1個集結構像這個 -MongoDB的GROUPBY不同的排序一起

{ 
"_id" : ObjectId("54d34cb314aa06781400081b"), 
"entity_id" : NumberInt(440), 
"year" : NumberInt(2011), 

} 
{ 
"_id" : ObjectId("54d34cb314aa06781400081e"), 
"entity_id" : NumberInt(488), 
"year" : NumberInt(2007), 
} 
{ 
"_id" : ObjectId("54d34cb314aa06781400081f"), 
"entity_id" : NumberInt(488), 
"year" : NumberInt(2008), 
} 
{ 
"_id" : ObjectId("54d34cb314aa067814000820"), 
"entity_id" : NumberInt(488), 
"year" : NumberInt(2009), 
} 
{ 
"_id" : ObjectId("54d34cb314aa067814000827"), 
"entity_id" : NumberInt(489), 
"year" : NumberInt(2009), 
} 

所以在輸出我想,我應該得到「ENTITY_ID」,最大「年」而已。(與「488」 ENTITY_ID猜想「年份」應該是2009年)。 我曾嘗試寫作查詢

$fin_cursor = $db->command(array(
       "distinct" =>"Profit_and_Loss", 
       "key" =>'entity_id', 
       "query" => array(array('$and'=>$financial_pl_search_array),array('$sort'=>array("year"=>-1))), 

       )); 
輸出

我想2場「ENTITY_ID」和「年」。 任何人都可以建議我做到這一點的最佳方式。 在此先感謝。

回答

1

您最好使用.aggregate()來做到這一點。這也是對司機的現代版本的集合對象的直接方法:

$result = $db->collection('Profit_and_loss')->aggregate(array(
    array('$group' => array(
     '_id' => '$entity_id', 
     'year' => array('$max' => '$year') 
    )) 
)); 

.distinct()命令只運行在一個單一的領域。其他形式需要JavaScript評估,因爲您已經注意到並且運行速度遠遠低於本機代碼。

+0

thanx的幫助。你救了我的一天。是否可以添加額外的查詢參數到這個聚合函數? – user1673091 2015-03-02 06:30:50

+0

@ user1673091查看['$ match'](http://docs.mongodb.org/manual/reference/operator/aggregation/match/)的文檔以及所有聚合流水線運算符和一般示例。在理性的情況下,你做不到的事情並不多。 – 2015-03-02 06:34:44

+0

我在上面的代碼中添加了'$ match'=> array('entity_id'=> array('$ in'=> array_values($ Entities))),然後給出錯誤,「異常:流水線階段指定對象必須包含一個字段「。 – user1673091 2015-03-02 07:12:38