最新版本的 MongoC# 驱动程序的聚合函数问题

Aggregate function issue with latest version of MongoC# Driver

我有使用 MongoDB 的 .NET 应用程序。我当前使用的驱动程序是 1.9.2。我正在尝试将其升级到 2.7.0。

我在使聚合查询在新版本中工作时遇到了一些困难:

1.9.2版驱动的工作代码为:

    public IEnumerable<Car> GetCarsModifiedInPeriod(DateTimeOffset dateFrom, DateTimeOffset dateTo)
    {
        var matchRequestFromDate = new BsonDocument
        {
            {
                "$match",
                new BsonDocument
                {
                    {
                        // Filter out those too recently modified
                       "LastUpdatedOn.0", new BsonDocument {{"$gte", dateFrom.Ticks}}
                    }
                }
            }
        };
        var matchRequestToDate = new BsonDocument
        {
            {
                "$match",
                new BsonDocument
                {
                    {
                        // Filter out those too recently modified
                        "LastUpdatedOn.0", new BsonDocument {{"$lte", dateTo.Ticks}}
                    }
                }
            }
        };

        var cars = collection.Aggregate(new AggregateArgs
        {
            Pipeline = new[] { matchRequestFromDate, matchRequestToDate},              
            AllowDiskUse = true,
            // Setting the OutputMode to Cursor allows us to return Mongo Doc Size > 16 MB - in the case when a large date  
            // range is used or a large number of cars were modified in a short period of time
            OutputMode = AggregateOutputMode.Cursor
        }).Select(r => r.Values.Select(c => c.AsObjectId.ToString()).First());

        var returnData = collection.AsQueryable().Where(c => cars.Contains(c.Id)).Select(c => c);

        return returnData;
    }

在指定的两个时间段的 returnData 上设置断点后,我得到了 25 辆汽车的计数,这正是我所期望的。

这就是我尝试为 2.7.0 版本的驱动程序重写的方式:

    public IEnumerable<Car> GetCarsModifiedInPeriod(DateTimeOffset dateFrom, DateTimeOffset dateTo)
    {
        var matchRequestFromDate = new BsonDocument
        {
            {
                "$match",
                new BsonDocument
                {
                    {
                        // Filter out those too recently modified
                       "LastUpdatedOn.0", new BsonDocument {{"$gte", dateFrom.Ticks}}
                    }
                }
            }
        };
        var matchRequestToDate = new BsonDocument
        {
            {
                "$match",
                new BsonDocument
                {
                    {
                        // Filter out those too recently modified
                        "LastUpdatedOn.0", new BsonDocument {{"$lte", dateTo.Ticks}}
                    }
                }
            }
        };

        var pipeline = new[] {matchRequestFromDate, matchRequestToDate};
        //var mongoPipeline = new AggregateArgs { Pipeline = pipeline, AllowDiskUse = true, OutputMode = AggregateOutputMode.Cursor };

        var aggregate = collection.Aggregate(); //.Match(mongoPipeline);

        aggregate.Options.AllowDiskUse = true;
        aggregate.Options.UseCursor = true;

        foreach (var pipe in pipeline)
        {
            aggregate.AppendStage<BsonDocument>(pipe);
        }

        var returnData = aggregate.ToList();

        return returnData;  
    }

如果我在此方法中的 returnData 中设置断点,我将得到大约 10,000 辆汽车的计数,因此看起来我没有正确应用相同的匹配项

您在 BsonDocument 秒内完成所有操作是否有原因?有一些方法可以让您的生活更轻松,例如这样的方法。

collection.Aggregate(new AggregateOptions() { AllowDiskUse = true, UseCursor = true })
.Match(Builders<BsonDocument>.Filter.Gte("LastUpdatedOn.0", dateFrom.Ticks) & Builders<BsonDocument>.Filter.Lte("LastUpdatedOn.0", dateFrom.Ticks))
.ToListAsync()

您可以通过对集合和构建器使用正确的 class 来进一步整理过滤。

查看查询,我不确定您是否需要使用聚合,除非您做的不仅仅是匹配。它可能只是一个发现。