private async Task SyncRemarksAsync() { Console.WriteLine("Synchronizing remarks..."); var remarks = await _database.GetCollection <Remark>() .AsQueryable() .ToListAsync(); var groups = new HashSet <Group>(); foreach (var remark in remarks) { if (remark.Group != null) { var group = groups.SingleOrDefault(x => x.Id == remark.Group.Id); if (group == null) { group = await _database.GetCollection <Group>() .AsQueryable() .FirstOrDefaultAsync(x => x.Id == remark.Group.Id); if (group == null) { continue; } groups.Add(group); } remark.Group.Criteria = group.Criteria; remark.Group.Members = group.Members.ToDictionary(x => x.UserId, x => x.Role); } remark.PositiveVotesCount = remark.Votes?.Count(x => x.Positive) ?? 0; remark.NegativeVotesCount = remark.Votes?.Count(x => !x.Positive) ?? 0; } var usersRemarks = remarks.GroupBy(x => x.Author.UserId); foreach (var userRemarks in usersRemarks) { await _cache.AddManyToSetAsync($"users:{userRemarks.Key}:remarks", userRemarks.Select(x => x.Id.ToString())); } var latestRemarks = remarks.OrderByDescending(x => x.CreatedAt).Take(100); foreach (var remark in latestRemarks) { await _cache.AddToSortedSetAsync("remarks-latest", remark.Id.ToString(), 0, limit : 100); } foreach (var remark in remarks) { await _cache.AddAsync($"remarks:{remark.Id}", remark); await _cache.GeoAddAsync($"remarks", remark.Location.Longitude, remark.Location.Latitude, remark.Id.ToString()); } Console.WriteLine("Synchronizing remarks has completed."); }