Я пытаюсь сделать другой алгоритм сортировки, который я назвал 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.Запрос и ответ (получить последние сообщения пользователей):
> 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();
}