没有找到匹配的创建者

本文关键字:创建者 | 更新日期: 2023-09-27 18:14:23

最近我完成了从mongosharp 1.8到2.0的迁移,唯一的问题是日期字段的聚合。让我向您展示如何构造query:

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
        });

我使用了文档中的这个例子。

我得到了以下例外:No matching creator found.我已经检查了生成的查询并手动执行它-结果是完美的。在复制测试代码并与我的代码进行比较后,我发现问题出在日期上。所以,谁能指出我正确的语法/查询规则的日期?下面生成的查询证明查询是正确的。

aggregate(
[
    {
        "$group" : {
            "_id" : {
                "Day" : {
                    "$dayOfYear" : "$DateTime"
                }
            },
        }
    },
    {
        "$project" : {
            "Day" : "$_id.Day",
            "_id" : 0
        }
    }
])

解决方案

所以,为了使事情正常工作,我做了下一个变通:

  • 创建聚合助手类,使用Legacy程序集封装对数据库的访问。
  • 实现在bson文档上构造查询的方法
  • 把它注入我的async 2.0服务,用sync代替async调用
下面是获取集合和执行查询的代码
_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驱动程序似乎对生成的匿名类型应该是什么"类型"感到困惑。

我将匿名类型更改为具体类型(通过为其声明一个类),从而修复了错误。

对于像我这样使用LINQ查询的人,你也可以考虑在Select中使用合并表达式(又名??),以避免不得不创建不必要的具体类型。

MongoDB。在编写以下示例

时使用驱动程序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应用coalesce:

new
{
    Title = x.Title ?? null
}

那么查询将被翻译为:

aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])

在这种情况下,Title在结果中得到保证。

这种方法的缺点是,如果从c#的角度来看,c#表达式确实看起来有点混乱。如果你在c#中启用了可空引用类型,并且Title属性不为空,你会看到一个警告/提示,说左操作数永远不会为空。