找不到匹配的创作者
No matching creator found
最近我从 mongosharp 1.8 迁移到 2.0。我遇到的唯一问题是日期聚合 fields.Let 我告诉你我如何构建查询:
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 example from documentation.
我遇到以下异常:No matching creator found.
我检查了生成的查询并手动执行了它 - 结果非常完美。在重现测试代码并与我的进行比较后,我发现问题出在日期上。那么,任何人都可以指出我更正日期的 syntax/query 规则吗?下面生成的查询证明查询是正确的。
aggregate(
[
{
"$group" : {
"_id" : {
"Day" : {
"$dayOfYear" : "$DateTime"
}
},
}
},
{
"$project" : {
"Day" : "$_id.Day",
"_id" : 0
}
}
])
解决方法
因此,为了让事情正常进行,我将采取下一个解决方法:
- 创建聚合助手 class,它使用旧程序集封装对数据库的访问。
- 实现使用在 bson 文档上构造的查询的方法
- 将其注入我的异步 2.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()
我今天遇到了这个错误。与提问者类似,我从 mongo 查询中填充了一个匿名类型。
当您获取的元素在数据库中不存在时,似乎会发生错误。在这种情况下,mongo 驱动程序似乎对 "type" 生成的匿名类型应该生成什么感到困惑。
我将匿名类型更改为具体类型(通过为其声明 class)并修复了错误。
对于像我这样使用 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所说的原因,结果无法映射到匿名类型,并引发异常:
No matching creator found.
如果针对 x.Title
应用合并:
new
{
Title = x.Title ?? null
}
那么查询将被翻译成:
aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])
以何种方式保证结果中Title
。
此方法的缺点 是,如果从 C# 的角度来看,C# 表达式确实看起来有点混乱。如果启用可空引用类型并且 Title
属性 在 C# 中不为空,您将看到 warning/hint 表示左操作数永远不会为空。
最近我从 mongosharp 1.8 迁移到 2.0。我遇到的唯一问题是日期聚合 fields.Let 我告诉你我如何构建查询:
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 example from documentation.
我遇到以下异常:No matching creator found.
我检查了生成的查询并手动执行了它 - 结果非常完美。在重现测试代码并与我的进行比较后,我发现问题出在日期上。那么,任何人都可以指出我更正日期的 syntax/query 规则吗?下面生成的查询证明查询是正确的。
aggregate(
[
{
"$group" : {
"_id" : {
"Day" : {
"$dayOfYear" : "$DateTime"
}
},
}
},
{
"$project" : {
"Day" : "$_id.Day",
"_id" : 0
}
}
])
解决方法
因此,为了让事情正常进行,我将采取下一个解决方法:
- 创建聚合助手 class,它使用旧程序集封装对数据库的访问。
- 实现使用在 bson 文档上构造的查询的方法
- 将其注入我的异步 2.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()
我今天遇到了这个错误。与提问者类似,我从 mongo 查询中填充了一个匿名类型。
当您获取的元素在数据库中不存在时,似乎会发生错误。在这种情况下,mongo 驱动程序似乎对 "type" 生成的匿名类型应该生成什么感到困惑。
我将匿名类型更改为具体类型(通过为其声明 class)并修复了错误。
对于像我这样使用 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所说的原因,结果无法映射到匿名类型,并引发异常:
No matching creator found.
如果针对 x.Title
应用合并:
new
{
Title = x.Title ?? null
}
那么查询将被翻译成:
aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])
以何种方式保证结果中Title
。
此方法的缺点 是,如果从 C# 的角度来看,C# 表达式确实看起来有点混乱。如果启用可空引用类型并且 Title
属性 在 C# 中不为空,您将看到 warning/hint 表示左操作数永远不会为空。