c # mongo сортировка и сортировка (устанавливается набором) - PullRequest
0 голосов
/ 21 мая 2018

Я пытаюсь сделать другой алгоритм сортировки, который я назвал set by set sort.Вот что я хочу, у нас есть коллекция «Сообщений»: «Боб» имеет 4 сообщения, а «Джейми» - 3 сообщения.

Проблема

В Монго я пытался группировать пользователей, а затем сортировать сообщения, но нет оператора $ second или $ 3rd, у меня есть только один оператор $ first, и этодайте мне первый набор сообщений.Не могу получить второй, третий, четвертый наборы и т. Д.

var group = new BsonDocument {
  { "_id", "$UserId" },
  { "_document", new BsonDocument { { "$first", "$$ROOT" } } }
};

// code ... 

Это дает мне только первые документы:

> [{ "UserId": "5b0154f3a614fbbb8a10fad0", "Title": "Bob Post 4", "DateTime": 2018-05-20 13:58:59.130, "Status": 0}, 
 { "UserId": "5b0154f3a614fbbb8a10fad1", "Title": "Jamie Post 3", "DateTime": 2018-05-20 13:57:59.130, "Status": 0}]

Ожидается

Ниже запроса и ответа, показывающих мой набор по примеру сортировки, ожидаемые результаты.Группировка сообщений по пользователю и сортировка новейших документов по дате и времени.Каждый новый запрос к серверу со смещением и лимитом я ожидаю появления новейших документов, сгруппированных по пользователю и отсортированных по дате.

  1. запрос получает последние сообщения пользователей.
  2. запрос на получение последних последних сообщений пользователей.
  3. запрос на получение предыдущих предыдущих сообщений пользователей.

1.Запрос и ответ (получить последние сообщения пользователей):

> getPosts(offset: 0, limit: 2)
> [{ "UserId": "5b0154f3a614fbbb8a10fad0", "Title": "Bob Post 4", "DateTime": 2018-05-20 13:58:59.130, "Status": 0}, 
 { "UserId": "5b0154f3a614fbbb8a10fad1", "Title": "Jamie Post 3", "DateTime": 2018-05-20 13:57:59.130, "Status": 0}]

2.Запрос и ответ (получите последние сообщения пользователей):

> getPosts(offset: 2, limit: 2)
> [{ "UserId": "5b0154f3a614fbbb8a10fad0", "Title": "Bob Post 3", "DateTime": 2018-05-20 12:58:59.130, "Status": 0}, 
 { "UserId": "5b0154f3a614fbbb8a10fad1", "Title": "Jamie Post 2", "DateTime": 2018-05-20 11:57:59.130, "Status": 0}]

3.Запрос и ответ (получите ранее до последних сообщений пользователей):

> getPosts(offset: 4, limit: 2)
> [{ "UserId": "5b0154f3a614fbbb8a10fad0", "Title": "Bob Post 2", "DateTime": 2018-05-20 12:58:59.130, "Status": 0}, 
  { "UserId": "5b0154f3a614fbbb8a10fad1", "Title": "Jamie Post 1", "DateTime": 2018-05-19 11:57:59.130, "Status": 0}]

Почтовый сборник (документы):

UserId: 5b0154f3a614fbbb8a10fad0
Title: Bob Post 1
DateTime: 2018-05-20 13:58:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad0
Title: Bob Post 2
DateTime: 2018-05-20 12:58:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad1
Title: Jamie Post 1
DateTime: 2018-05-20 13:57:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad1
Title: Jamie Post 2
DateTime: 2018-05-20 11:57:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad0
Title: Bob Post 3
DateTime: 2018-05-20 12:58:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad1
Title: Jamie Post 3
DateTime: 2018-05-19 11:57:59.130
Status: 0

UserId: 5b0154f3a614fbbb8a10fad0
Title: Bob Post 4
DateTime: 2018-05-18 12:58:59.130
Status: 0

Код:

public virtual async Task<IEnumerable<Post>> PagingAsync(int offset, int limit, double lat, double lon, double maxDistanceMeters, double minDistanceMeters, string city, string category, string requestingUserId)
   {
     var col = _context._database.GetCollection<BsonDocument>("post");
     var dateSort = Builders<BsonDocument>.Sort.Descending(document => document["DateTime"]);
     var addRadar = Builders<BsonDocument>.Filter.Eq(document => document["AddToRadar"], true);
     var approved = Builders<BsonDocument>.Filter.Eq(document => document["Status"], PostStatus.Approved);
     var cityEq = Builders<BsonDocument>.Filter.Eq(document => document["City"], city);
     var notEqualRequestedUserId = Builders<BsonDocument>.Filter.Ne(document => document["UserId"], requestingUserId);

     if (city == "") {
       cityEq = Builders<BsonDocument>.Filter.Empty;
     }

     var categoryEq = Builders<BsonDocument>.Filter.Eq(document => document["CategoryId"], category);
     var group = new BsonDocument
     {
       { "_id", "$UserId" },
       { "_document", new BsonDocument { { "$first", "$$ROOT" } } }
     };

     ProjectionDefinition<BsonDocument> projection = new BsonDocument{{ "document", "$_document"}};

     List<BsonDocument> result;

     if (category == "")
       categoryEq = Builders<BsonDocument>.Filter.Empty;

     if (requestingUserId == "") 
       notEqualRequestedUserId = Builders<BsonDocument>.Filter.Empty;


     result = await col.Aggregate()
         .Match(approved)
         .Match(addRadar)
         .Match(categoryEq)
         .Match(cityEq)
         .Match(notEqualRequestedUserId)
         .Sort(dateSort)
         .Group(group)
         .Project(projection)
         .Skip(offset)
         .Limit(limit)
         .ToListAsync();

     return result.Select(x => BsonSerializer.Deserialize<Post>(x["document"].AsBsonDocument)).ToList();
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...