最近我已经从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
});
我使用this中的documentation示例。
我遇到以下异常:No matching creator found.
我检查了生成的查询并手动执行了 - 结果很完美。再现测试代码并与我比较我发现问题是在日期。那么,有人能指出我更正日期的语法/查询规则吗?下面生成的查询证明查询是正确的。
aggregate(
[
{
"$group" : {
"_id" : {
"Day" : {
"$dayOfYear" : "$DateTime"
}
},
}
},
{
"$project" : {
"Day" : "$_id.Day",
"_id" : 0
}
}
])
解决方法
所以,为了让事情有效,我会做下一个解决方法:
以下是获取收集和执行查询的代码
_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()
答案 0 :(得分:3)
对于像我这样使用LINQ查询的人,您也可以考虑在Select
中使用coalesce expression (aka ??
)以避免创建不必要的具体类型。
MongoDB.Driver 2.11.2
考虑此查询:
var query = Collection
.Where(x => filter.Inject())
.Select(x => new
{
Title = x.Title // Some old entities do not have Title
});
查询将转换为$project
,例如:
aggregate([{ "$project" : { "Title" : "$title" } }])
当某些项目不具有$title
时,由于@ r-j所述的原因,结果无法映射到匿名类型,并且引发异常:
没有找到匹配的创建者。
如果对x.Title
施加合并:
new
{
Title = x.Title ?? null
}
然后查询将被翻译为:
aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])
以这种方式保证结果中的Title
。
这种方法的缺点 是,如果从C#的角度来看,C#表达式确实有些令人困惑。如果启用了可为空的引用类型,并且在C#中Title
属性不为null,则会看到警告/提示,指出左操作数永远不会为null。
答案 1 :(得分:2)
我今天遇到此错误。类似于问这个问题的人,我在mongo查询中填充了一个匿名类型。
当您要获取的元素在数据库中不存在时,似乎发生了错误。在这种情况下,mongo驱动程序似乎对生成的匿名类型应作为哪种“类型”感到困惑。
我将匿名类型更改为具体类型(通过为其声明一个类),并修复了错误。