Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 找不到匹配的创建者_C#_Mongodb_Aggregation Framework_Mongodb .net Driver - Fatal编程技术网

C# 找不到匹配的创建者

C# 找不到匹配的创建者,c#,mongodb,aggregation-framework,mongodb-.net-driver,C#,Mongodb,Aggregation Framework,Mongodb .net Driver,最近,我已经从mongosharp 1.8迁移到2.0。我面临的唯一问题是使用日期字段进行聚合。让我向您展示如何构造查询: var aggregateResult = Items.Aggregate() .Group( g => new { // some fields Day = g.DateTime.DayOfYear }, z => new { MyK

最近,我已经从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
        });
我用的例子来自

我得到以下异常:找不到匹配的创建者。我已经检查了生成的查询并手动执行了它——结果非常完美。在复制测试代码并与我的进行比较后,我发现问题出在日期上。那么,有人能告诉我日期的正确语法/查询规则吗?下面生成的查询证明查询是正确的

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

所以,为了让事情顺利进行,我要做下一个变通方法:

创建聚合帮助器类,该类使用旧程序集封装对数据库的访问。 实现使用在bson文档上构造的查询的方法 将其注入我的Async2.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()

我今天遇到了这个错误。与提出问题的人类似,我有一个匿名类型是从mongo查询填充的

当数据库中不存在要获取的元素时,似乎会发生此错误。在这种情况下,mongo驱动程序似乎对生成的匿名类型应该是什么类型感到困惑


我通过声明一个类来更改匿名类型,并修正了错误。

对于使用像我这样的LINQ查询的人,你也可以考虑使用select来避免创建不必要的具体类型。

编写以下示例时使用了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,如:

当某些项目没有$title时,由于@r-j所述的原因,结果无法映射到匿名类型,并且引发异常:

找不到匹配的创建者

如果适用,则结合x.标题:

然后,查询将转换为:

aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])
以何种方式在结果中保证标题


这种方法的缺点是,如果从C的角度看,C表达式看起来确实有点混乱。如果启用可为null的引用类型,并且C中的Title属性不为null,则会看到警告/提示,说明左操作数从不为null。

是否可以添加项的定义?@RomanDibikhin,Database.GetCollectioncollection\u name。。。。用作iMongoCollections我明天将重现您的问题。创建类解决了相同的问题,我很幸运找到了答案,WOWyes,这实际上也解决了我的问题。
new
{
    Title = x.Title ?? null
}
aggregate([{ "$project" : { "Title" : { "$ifNull" : ["$title", null] } } }])