Метод среза определения проекции драйвера MongoDB .NET не работает

#c# #mongodb #asp.net-core #mongodb-query #mongodb-.net-driver

#c# #mongodb #asp.net-core #mongodb-запрос #mongodb-.net-driver

Вопрос:

Я работаю с коллекцией MongoDB в ASP.NET Приложение Core 3 через совместимый драйвер MongoDB. Структура документа в моей коллекции включает, среди прочего, поле массива (назовем его «шаги»). Моя задача — спроецировать коллекцию со всеми ее полями, извлекая последние два элемента этого массива для каждого документа.

Это запрос 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);
 

где filter является предопределенным FilterDefinition<BsonDocument> , который я использую.
Когда я пытаюсь выполнить запрос в моем ASP.NET контроллер через Swagger, я получаю исключение, в котором говорится:

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

Я пытаюсь понять, почему он отличается от проекции $ slice, которую я использую при запросе коллекции в Robo 3T. Кажется, что я передаю 2 имени поля для среза и какие элементы массива принимать.
Любая помощь будет оценена. Спасибо.

Комментарии:

1.Похоже, что в первом коде вы используете Find docs.mongodb.com/manual/reference/operator/projection/slice /…, но во втором Aggregation (внутри GetDataByFilterDefinitionAsync ): docs.mongodb.com/manual/reference/operator/aggregation/slice /… для чего требуется не менее 2 аргументов. Это разные команды. Если вы хотите эмулировать Find команду MQ, вам следует использовать Find методы c #

Ответ №1:

Я не думаю, что есть разница, и на самом деле драйвер C # довольно хорошо согласуется с командой оболочки Mongo. Я бы сделал это следующим образом, хотя:

 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();
 

Комментарии:

1. Спасибо, это сработало. Проблема заключалась в том, что в методе GetDataByFilterDefinitionAsync() использовался метод Aggregate(), который использует другой вариант среза. Сначала я этого не заметил, потому что mongoService — это библиотека DLL из внешнего проекта, с которым я раньше не работал.