MongoDB получает последние 10 видов деятельности

86
9

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

{
"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"
}
}

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

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

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

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

спросил(а) 2014-03-24T12:20:00+04:00 6 лет, 3 месяца назад
1
Решение
54

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

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

ответил(а) 2014-03-24T12:31:00+04:00 6 лет, 3 месяца назад
39

Я думаю, что я прокомментировал, что Т'М не действительно видит критерии отбора. Поэтому, если вы "снаружи" одной коллекции, у вас есть проблемы. Но если ваши поля - это то, что вы хотите "отфильтровать", просто выполните это:

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

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

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

И самая последняя часть - это основной "предел". Так что просто верните последние 10 записей.

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

ответил(а) 2014-03-24T13:19:00+04:00 6 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема