2014-03-24 2 views
0

В моей социальной сети я хочу, чтобы получить корм для члена, из членов следящие позволяют говорить 20 категории/члену.
когда категория/член (затем член) сделать деятельность она вставляется в коллекцию под названием recent_activity:MongoDB получить последние 10 мероприятий

{ 
    "content_id": "6", // content id member A is following 
    "content_type_id": "6",// content type (category , other member) 
    "social_network_id": "2", // the action category did (add/like/follow) 
    "member_id": "51758", //Member A 
    "date_added": ISODate("2014-03-23T11:37:03.0Z"), 
    "platform_id": NumberInt(2), 
    "_id": ObjectId("532ec75f6b1f76fa2d8b457b"), 
    "_type": { 
    "0": "Altibbi_Mongo_RecentActivity" 
    } 
} 

Я хочу, чтобы, когда из членов Войти в систему, чтобы получить последний 10 мероприятий по категориям/член

моя проблема:

Как получить Всего 10 мероприятий для всех категорий/членов.

Лучше сделать это в одном запросе или сделать цикл for.

+0

для определенной категории или для всех категорий? – Alex

+0

@alex для всех. – KJA

+0

вам, вероятно, нужно будет взглянуть на структуру агрегации mongodb – Alex

ответ

1

Для этого варианта использования я бы предложил инвертировать логику и сохранить отдельный объект из последних 10 действий для члена A, который постоянно обновляется. Хотя это решение более тяжелое для записи, оно делает чтение простым и простым, и его можно легко пропустить. Я хотел бы откровенно рекламировать сообщение в блоге, которое я написал некоторое время назад о news feeds with mongodb, в котором излагается этот подход.

Этот подход «отключение» может показаться чересчур сложным, но когда вы думаете о важности фильтрации/ранжирования (a la facebook), нажимайте сообщения для особо важных событий (facebook, twitter) или регулярных электронных писем (практически все), вы получите одно место в своем коде для выполнения всей этой логики.

+0

это уже мой логин. У меня есть еще одна коллекция под названием member feed, и я пишу все действия для категорий/членов для каждого участника. но я борюсь с IO, размер базы данных уже составляет 64G, поэтому я думаю об этом варианте – KJA

0

Я думаю, что я прокомментировал, что T'm на самом деле не видит критерии отбора. Поэтому, если вы «снаружи» одной коллекции, у вас есть проблемы. Но если ваши указанные поля являются вещи, которые вы хотите «Фильтр» с помощью, а затем просто сделать это:

db.collection.find({ 
    "social_network_id": "2", 
    "content_type_id": "6", 
    "content_id": "6", 
    "member_id": { "$ne": "51758" } 
}) 
.sort({ "$natural": -1 }) 
.limit(10); 

Так что же это сделать? Вы сопоставляете различные условия в данных, чтобы выполнить «соответствие категории» (если я понял, что имел в виду), то вы убедитесь, что вы являетесь не подходящих записей того же члена.

Последние части делают «естественный» вид. Это важный потому, что ObjectId is monotinic, или математика говорит "постоянно возрастающий". Это означает, что «новейшие» записи всегда являются «самым высоким» значением. Таким образом, нисходящий порядок «последним» является «самым старым».

И самая последняя часть является основным «пределом». Так что просто верните последние 10 записей.

До тех пор, пока вы можете «фильтровать» в пределах той же коллекции, какой бы вы ни хотели, тогда это должно быть хорошо.

+0

Что вам непонятно? – KJA

+0

@KJA очень простой. Что вы хотите выбрать? Вы не сделали окончательного заявления, чтобы сказать ** точно, что это такое. Надеюсь, что получится. Если это так, вы получите * фактический * ответ, который вы хотите. –

+0

Спасибо большое за то, что я со мной. Хорошо, я надеюсь, что это поможет вам. Предположим, что существует 100 активных категорий, каждая категория, когда действие вставляется в коллекцию recent_activity (проверьте коллекцию в моем вопросе). , и вы следуете за 10 категориями, и когда вы входите в систему, вы хотите выбрать последние 10 видов деятельности для своих 10 категорий следующим образом. – KJA

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