如何使用 MongoDB C# Driver Aggregate 在 2 个字段上获取具有特定值的最新项目?

ric*_*uto 4 c# linq mongodb

感谢您光临:)

基本上,我有一个 MongoDB,其中包含具有以下属性的文档集合:

String group;
String key;
String value;
DateTime timestamp;
Run Code Online (Sandbox Code Playgroud)

我想获得所有最新文档的列表,这些文档具有唯一(不同)的组和键组合。

存在具有相同组和键但值不同的文档;我只想要具有最新时间戳的那个。

所以如果我有:

文档 A:组 = 2;键 = 某物;值 = 123;时间戳 = 20160621;

文件 B:组 = 2;键 = 某物;值 = 888;时间戳 = 20160622;

我只想在查询中检索文档 B(值为 888)。

这是我到目前为止得到的:

var aggregate = collection.Aggregate()
                .Match(new BsonDocument { { "deviceid", deviceid } })
                .Sort( new BsonDocument { { "timestamp", -1} })
                .Group(new BsonDocument { { "groupkey", "$group" }, { "latestvalue", "$first.value" } });
Run Code Online (Sandbox Code Playgroud)

然而,这会导致以下异常:“命令聚合失败:组聚合字段‘groupkey’必须定义为对象内的表达式”

1)关于如何使用聚合来做我想做的事情的任何提示?(基本上,按 timstamp 降序排序,并根据 2 个字段进行区分)

2)关于如何将聚合转换为列表或类似的任何提示?(我需要在所有结果上使用 linq 来查找具有特定组和键的文档的值)

pro*_*r79 6

使用聚合框架时,作为培训的一部分,我建议在 monogo shell/robomongo 中执行相同的操作以查看正确的语法。

请在下面找到查询的固定语法

var aggregate = collection.Aggregate()
                .Match(x=>x.key== "k10")
                .SortByDescending(x=>x.timestamp)
               .Group( BsonDocument.Parse("{ '_id':'$group',  'latestvalue':{$first:'$value'} }")).ToList();
Run Code Online (Sandbox Code Playgroud)