【问题标题】:MongoDB .NET Driver ProjectionDefinition Slice method does not workMongoDB .NET 驱动程序 ProjectionDefinition Slice 方法不起作用
【发布时间】: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&lt;BsonDocument&gt;。 当我尝试通过 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 字段名称传递给切片,以及要采用哪些数组成员。 任何帮助将不胜感激。谢谢。

【问题讨论】:

标签: c# mongodb asp.net-core mongodb-query mongodb-.net-driver


【解决方案1】:

我认为没有区别,实际上,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();

【讨论】:

  • 谢谢,它成功了。问题是在 GetDataByFilterDefinitionAsync() 方法中,使用了 Aggregate() 方法,它使用了不同风格的 Slice。起初我没有注意到它,因为 mongoService 是来自我之前没有使用过的外部项目的 DLL 库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2016-07-25
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多