2016-08-26 2 views
1

Я пытаюсь реализовать технику, известную как bucketing в MongoDb (или так называлось в мастерской MongoDB), и для достижения этой цели использует Push и Slice. Это делается для того, чтобы создать систему пользовательских фидов, аналогичную системе Twitter/facebook.Bucketing with MongoDB C# Драйвер

По существу у меня есть документ с массивом элементов (элементы фида). Я хочу создать новый документ, когда это количество элементов достигнет определенного числа для пользователя.

Итак, если в последней коллекции документа userFeed имеется 50 элементов, я хочу, чтобы новый документ был создан, и новый элемент, который нужно вставить в массив элементов вновь созданного документа.

Это код, который я до сих пор:

var update = Builders<UserFeed> 
        .Update 
        .CurrentDate(x => x.DateLastUpdated) 
        .PushEach(x => 
         x.Items, 
         new List<FeedItemBase> { feedItem }, 
         50); 

       var result = await Collection.UpdateOneAsync(x => 
        x.User.Id == userFeedToWriteTo, 
        update, 
        new UpdateOptions { IsUpsert = true } 
        ).ConfigureAwait(false); 

...

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

new UpdateOptions { IsUpsert = true } 

, но, по-видимому, нет. Любая помощь была бы принята с благодарностью

ответ

0

Итак, выписав проблему и произнеся ее вслух несколько раз, я понял, в чем проблема.

Мне нужен счетчик на основном документе пользователя, который нужно увеличивать каждый раз, когда элемент был добавлен (был отправлен элемент фида). И в моем запросе выполнить обновление/upsert мне просто нужно было проверить < 50. После этого все работает так, как ожидалось. Вот исправленный код

var update = Builders<UserFeed> 
        .Update 
        .CurrentDate(x => x.DateLastUpdated) 
        .PushEach(x => 
         x.Items, 
         new List<FeedItemBase> { feedItem }, 
         50) 
         .Inc(x => x.Count, 1); 

       var result = await Collection.UpdateOneAsync(x => 
        x.User.Id == userFeedToWriteTo && x.Count < 50, 
        update, 
        new UpdateOptions { IsUpsert = true } 
        ).ConfigureAwait(false); 

И пока счетчик не будет исправлена, если элемент подачи пользователя удаляется из массива пунктов, все должно работать, как ожидалось. Тем не менее, проблемы будут возникать, если вы измените счетчик на удаление, потому что в итоге вы добавите элементы, добавленные в предыдущие документы, и вам нужно будет выполнить сортировки после размотки данных, которые в настоящее время мне не нужны. Это означает, что в конечном итоге вы получите несколько документов с менее чем 50 элементами массива, но для меня это не имеет большого значения.

Надеюсь, это поможет кому-то, кто пытается реализовать аналогичное решение в C#.

Смежные вопросы