#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 из внешнего проекта, с которым я раньше не работал.