У меня есть структура коллекций mongodb 1, как это-
{
"_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» только с максимальным значением «year» (предположим, что с «488» entity_id «year» должно быть 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» и «year».
Может кто-нибудь предложить мне лучший способ сделать это.
Заранее спасибо.
Вы лучше использовать .aggregate()
сделать это. Это также прямой метод для объектов коллекции в современных версиях драйвера:
$result = $db->collection('Profit_and_loss')->aggregate(array(
array( '$group' => array(
'_id' => '$entity_id',
'year' => array( '$max' => '$year' )
))
));
.distinct()
Команда работает только над одним полем. Другие формы требуют оценки JavaScript, как вы заметили, и работают значительно медленнее, чем собственный код.
Других решений пока нет …