#mongodb #.net-core #aggregation-framework #pipeline
#mongodb #.net-core #aggregation-framework #конвейер
Вопрос:
я впервые создаю систему с использованием Net Core и MongoDB, мне удается создать полностью работающий CRUD с сортировкой и нумерацией страниц, отправив все входные параметры в контроллере на уровень обслуживания для запроса из базы данных.
это мой входной параметр для Get Action…
**public IActionResult Get(string userID, string sellerID, DateTime? dateFrom, DateTime? dateTo, string search, string sortValue, string filter, int offset = 0, int limit = 10)**
Мне удалось создать FilterdefinitionBuilder и SortDefinitionBuilder
**//MongoDB Definition Builder
#region MongoDB Definition builder
FilterDefinitionBuilder<OrderModel> filterBuilder = Builders<OrderModel>.Filter;
FilterDefinition<OrderModel> filterDefinition = filterBuilder.Empty;
SortDefinitionBuilder<OrderModel> sortBuilder = Builders<OrderModel>.Sort;
SortDefinition<OrderModel> sortDefinition = sortBuilder.Ascending(x => x.ID);
#endregion**
#пример 1
**if (sortValue.ToUpper() == "DESC")
{
sortDefinition = sortDefinition.Descending(x => x.ID);
}**
#Пример 2
**// Проверка диапазона дат
#region dateFrom and dateTo
if (dateFrom.HasValue amp;amp; dateTo.HasValue)
{
if (dateFrom.Value < dateTo.Value.AddDays(1))
{
filterDefinition = filterDefinition amp; filterBuilder.Gte(x => x.CreatedDate, dateFrom.Value) amp;
filterBuilder.Lt(y => y.CreatedDate, dateTo.Value.AddDays(1));
}
}
#endregion**
Чего я хочу добиться, так это создать пустой конвейер с помощью builder аналогично тому, что я сделал с помощью sortDefinition и filterDefinition, а затем, когда будут выполнены определенные условия, создайте этап конвейера и добавьте в конвейер.
Я безрезультатно искал ответ в Интернете, но, насколько я понимаю, я считаю, что могу удалить как sortDefinition, так и filterDefinition и просто использовать этапы, доступные в конвейере, для выполнения CRUD, сортировки и разбивки на страницы, используя этапы, например, «Сопоставление», «сортировка», «пропустить», «ограничить». Но до сих пор я все еще не знаю правильного синтаксиса
Варианты конвейера, предложенные Intellisense
пожалуйста, спрашивайте, знает ли кто-нибудь, как это сделать.
С уважением, Хазмин
Комментарии:
1. Привет, Хазим. Добро пожаловать в Stack Overflow. Вы смотрели Atlas Search? Он будет сортировать по релевантности сам по себе, и результаты поиска будут обрабатываться намного быстрее. Вы можете сортировать по числовым полям с
near
помощью оператора на$search
этапе.2. Спасибо за обмен @Nice-Guy, я рассмотрю это, но я хотел бы узнать, как построить конвейер, я искал везде в течение нескольких дней, но не нашел правильных кодов C #, чтобы сделать это аналогично тому, как я создаю sortDefinition и filterDefinition, есливы или кто-либо еще обладаете знаниями о построении конвейера на c #, я искренне признателен, если вы могли бы показать мне пример того, как построить конвейер в контроллере, чтобы я позже мог добавлять к нему этапы в зависимости от проверки ввода; а затем отправить только одно конвейерное определение на уровень обслуживания. Спасибо
3. Я вставил пример того, как сгенерировать конвейер с помощью MongoDB Compass.
Ответ №1:
Я помещаю свое решение здесь для дальнейшего использования, а также надеюсь, что оно поможет всем, кто пытается создать проект с использованием C # и MongoDB. Мои намерения — создать код, который потенциально может использоваться как статический класс; что-то, что можно повторно использовать для каждого отфильтрованного метода Get. это то, что я сделал до сих пор…
[HttpGet]
public IActionResult GetFiltered()
{
var filter = Builders<User>.Filter;
var sort = Builders<User>.Sort;
ProjectionDefinition<User,User> projection = Builders<User>.Projection.Include(x=>x.FirstName);
PipelineDefinition<User, User> pipeline = new EmptyPipelineDefinition<User>();
pipeline = pipeline.Match(filter.Eq(x => x.Password, null));
pipeline = pipeline.Match(filter.Eq(x => x.FirstName, "Hazmin"));
pipeline = pipeline.Skip(0);
pipeline = pipeline.Limit(3);
pipeline = pipeline.Sort(sort.Ascending(x => x.LastName));
pipeline = pipeline.Project(projection);
var users = _userService.GetAll(pipeline);
return Ok(users);
}
Надеюсь, это немного поможет… скоро будет обновлено для дополнительных обновлений.
Спасибо за чтение…
С уважением, Hazmin
Ответ №2:
Добро пожаловать в Stack Overflow.
вот видео-пример того, как вы получите пример того, как построить конвейер для C #. Надеюсь, это поможет. Я также опубликовал код, сгенерированный в видео. Кстати, это также доступно в браузере в пользовательском интерфейсе Atlas.
new BsonArray
{
new BsonDocument("$search",
new BsonDocument("search",
new BsonDocument
{
{ "query", "Terasse" },
{ "path", "Entity.Name" }
}))
}
Обратите внимание, что этот код был сгенерирован Compass, и вы можете захотеть протестировать изменение второго new BsonDocument("search")
на new BsonDocument("text")
, поскольку оператор поиска устарел. Тем $search
не менее, этап конвейера агрегации по-прежнему корректен.