2014-12-05 2 views
2

Я пытаюсь выполнить запрос в MongoDB в первую группу по id, а затем сортировать по убыванию. У меня есть функциональное выражение LINQ здесь:Понимание MongoDB Aggregate и GroupBy

var list = this.GetPackages().ToList(); 
     list = list.OrderByDescending(package => package.PackageVersion) 
     .GroupBy(g => g.PackageId) 
     .Select(packages => packages.First()).ToList(); 
     return list; 

Но я не могу придумать с эквивалентным выражением MongoDB, и я не могу даже получить функцию $ проекта для работы:

db.packages.aggregate([ 
    { 
     $sort : { packageVersion : -1 } 
    }, 
    { 
     $group: { _id: "$PackageId" } 
    }, 
    { 
     $project: { PackageVersion: 1, Title: 1 } 
    } 
]) 

My результат:

{ "_id" : "e3afb1fe-dce7-476e-8372-cd8201abc131" } 
{ "_id" : "e3722179-0903-4894-9a86-3a3ffd94de83" } 
{ "_id" : "3e65e93a-4c2c-4a02-8b21-e5858a4058dd" } 

ли запрос MongoDB правильного формата, и есть эквивалент способ сделать это с помощью драйвера C# MongoDB?

+0

Вам не хватает '[]'? или это просто опечатка? и свойства чувствительны к регистру. – BatScream

+0

К сожалению, я добавил скобки, но ничего не изменил. Я добавлю результат в исходное сообщение. –

+0

Пожалуйста, проверьте ответ ниже. – BatScream

ответ

2

Используйте оператор $first и переменную $$ROOT, чтобы получить первый документ в группе.

$$ROOT является переменной системой, которая:

Список литературы корневого документа, т.е. документа верхнего уровня, в настоящее время , обрабатываемого в стадии агрегации трубопровода.

Затем проведите первый документ.

db.packages.aggregate([ 
    { 
     $sort : { packageVersion : -1 } 
    }, 
    { 
     $group: { "_id": "$PackageId","firstPackage":{$first:"$$ROOT"}} 
    }, 
    { 
     $project: { "firstPackage": 1, "_id": 0} 
    } 
]) 
+0

Я использовал этот код: db.packages.aggregate ([ {$ сортировки: {PackageVersion: -1} }, { $ группы: {_id: "$ PackageID", "PackageVersion": {$ сначала: «$ PackageVersion»}} } ]) , который приближает меня, но мне все равно нужно выбрать все свойства, желательно, не называя их явно в заявлении проекта. Это возможно? –

+0

Да, вам нужно использовать доступ с помощью '$$ ROOT'. Но вы получите документ, привязанный к ключу. См. Обновленный ответ. – BatScream

+0

Хорошо, это сработало, спасибо, но можете ли вы объяснить, что использует $$ ROOT? –