【发布时间】:2015-09-24 20:37:49
【问题描述】:
最近我从 mongosharp 1.8 迁移到 2.0。我遇到的唯一问题是日期字段的聚合。让我向您展示我如何构造查询:
var aggregateResult = Items.Aggregate()
.Group(
g => new {
// some fields
Day = g.DateTime.DayOfYear
},
z => new {
MyKey = z.Key
// agrregation functions
})
.Project(
d => new {
// projection for other fields
d.MyKey.Day
});
我使用了来自documentation 的this 示例。
我遇到了以下异常:No matching creator found. 我检查了生成的查询并手动执行了它 - 结果很完美。复制测试代码并与我的比较后,我发现问题出在日期上。那么,谁能指出我纠正日期的语法/查询规则?下面生成的查询证明查询是正确的。
aggregate(
[
{
"$group" : {
"_id" : {
"Day" : {
"$dayOfYear" : "$DateTime"
}
},
}
},
{
"$project" : {
"Day" : "$_id.Day",
"_id" : 0
}
}
])
解决方法
所以,为了让事情顺利进行,我会采取下一个解决方法:
- 创建聚合帮助器类,该类使用旧程序集封装对数据库的访问。
- 实现使用在 bson 文档上构建的查询的方法
- 将其注入我的 async 2.0 服务并用 sync 替换异步调用
下面是获取集合和执行查询的代码
_collection = new MongoDatabase(new MongoServer( MongoServerSettings.FromUrl(connectionString)), databaseName, new MongoDatabaseSettings()).GetCollection<MyClass>("collection_name");
var pipeline = new[] { match, groupBy, project, .... };
_collection.Aggregate(new AggregateArgs { Pipeline = pipeline }).ToList()
【问题讨论】:
-
你能添加
Items的定义吗? -
@RomanDibikhin, Database.GetCollection
("collection_name") .... 用作 IMongoCollection -
明天我会重现你的问题。
标签: c# mongodb aggregation-framework mongodb-.net-driver