【发布时间】:2020-12-01 11:48:31
【问题描述】:
我通过兼容的 MongoDB 驱动程序在 ASP.NET Core 3 应用程序中使用 MongoDB 集合。 我的集合中的文档结构包括一个数组字段(我们称之为“步骤”)。 我的任务是投影集合及其所有字段,同时为每个文档获取该数组的最后两个成员。
这是我在 Robo 3T 中运行的 mongo 查询:
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 中查询集合时使用的 $slice 投影有什么不同。似乎我将 2 字段名称传递给切片,以及要采用哪些数组成员。 任何帮助将不胜感激。谢谢。
【问题讨论】:
-
看起来,在第一个代码中,您使用
Finddocs.mongodb.com/manual/reference/operator/projection/slice/…,但在第二个代码中Aggregation(在GetDataByFilterDefinitionAsync内):docs.mongodb.com/manual/reference/operator/aggregation/slice/… 至少需要 2 个参数。这是不同的命令。如果你想模拟FindMQ 命令,你应该使用Findc#方法
标签: c# mongodb asp.net-core mongodb-query mongodb-.net-driver