MongoDB .NET Driver ProjectionDefinition Slice 方法不起作用

MongoDB .NET Driver ProjectionDefinition Slice method does not work

我通过兼容的 MongoDB 驱动程序在 ASP.NET Core 3 应用程序中使用 MongoDB collection。 我的 collection 中的文档结构包括一个数组字段(我们称之为“步骤”)。 我的任务是投影 collection 及其所有字段,同时为每个文档获取该数组的最后两个成员。

这是一个 mongo 查询,我在 Robo 3T 中 运行:

db.getCollection('MyCollection').find({}, {"steps" : {$slice: -2}})

它运行完美,并且以我想要的完全相同的方式投影数据。 但是,我无法将其成功复制到我的 ASP.NET 应用程序。

这就是我在 C# 中构建投影的方式:

ProjectionDefinitionBuilder<BsonDocument> fieldsBuilder = Builders<BsonDocument>.Projection;
ProjectionDefinition<BsonDocument> stepsArrayProjection = fieldsBuilder.Slice("steps", -2);
List<MyCollectionModel> result = await myMongoService.GetDataByFilterDefinitionAsync(filter, stepsArrayProjection);

其中过滤器是我使用的预定义 FilterDefinition<BsonDocument>。 当我尝试通过 Swagger 运行 我的 ASP.NET 控制器中的查询时,我得到一个异常,它说:

MongoDB.Driver.MongoCommandException: Command aggregate failed: Expression $slice takes at least 2 arguments, and at most 3, but 1 were passed in.

我想了解的是,为什么它与我在 Robo 3T 中查询 collection 时使用的 $slice 投影有任何不同。似乎我将字段名称传递给 slice,并传递 2 个数组成员。 任何帮助将不胜感激。谢谢。

我认为没有区别,实际上,C# 驱动程序与 Mongo shell 命令非常一致。不过,我会这样做:

var filter = Builders<MyCollectionModel>.Filter.Empty;
var project = Builders<MyCollectionModel>.Projection.Slice(x => x.Steps, skip);
var result = context.MyMongoCollection.Find(filter).Project(project).ToList();