На самом деле драйвер ведет себя здесь корректно, но вы испытываете ограничение на $ group стадии конвейера в Aggregation Framework. В документации указано, что:
Выходные документы содержат поле _id, в котором содержится отдельная группа по ключу. Выходные документы могут также содержать вычисляемые поля, которые содержат значения некоторого выражения аккумулятор , сгруппированного по полю _id $ group
Так что в вашем случае вы пытаетесь обратиться к полю _id
без какого-либо аккумулятора.
С логической точки зрения ваши запросы похожи. Первый переводится на:
{
"$group" : {
"_id" : "$Name",
"Count" : {
"$sum" : 1
}
}
}
Второй будет возвращать те же данные, но у вас есть объект в качестве ключа группировки. Чтобы это исправить, в C # вам нужно ввести выражение .First()
, которое будет переведено в $ first , поэтому запустите:
Col.Aggregate()
.Group(
x => new { Name = x.Name },
x => new { Name = x.First().Name, Count = x.Sum(s => 1) })
.ToList();
будет работать под запросом к базе данных:
{
"$group" : {
"_id" : {
"Name" : "$Name"
},
"Name" : {
"$first" : "$Name"
},
"Count" : {
"$sum" : 1
}
}
}
Работает, но логически возвращает те же данные, что и первая агрегация