Как построить конвейер MongoDB и добавлять этапы в конвейер с помощью .Net Core MongoDB Driver

#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 не менее, этап конвейера агрегации по-прежнему корректен.