Я думаю, что вам следует использовать фоновый рабочий, который периодически выполняет ваш M / R-запрос и сохраняет результаты в коллекции, которую вы можете легко выполнить, например,
TopStories {
"UserId" : ObjectId("..."),
"List" : [
{ "TotalVotes" : 200,
"FriendVotes" : 28,
"StoryName" : "test",
"StoryId" : ObjectId('...')
},
{
/* etc. */ }
}
]
}
Это тривиально для запроса,но не очень гибкий.Более гибкая структура, позволяющая избежать встроенного списка:
TopStory {
"UserId": ObjectId("..."),
"StoryId" : ObjectId("..."),
"StoryName" : "foo",
"FriendVotes" : 28,
"TotalVotes" : 200
// etc.
}
Последний также может использоваться для сортировки по количеству общих голосов, например.
M / R раньше«большой молот», который не должен запускаться в режиме реального времени с веб-интерфейса или чего-либо еще.Были планы по улучшению этого, но я не знаю текущее состояние этого, поэтому я бы не рисковал.Я также считаю, что это задание M / R не будет очень быстрым, если ваши коллекции станут большими, ожидайте, что это будет выполняться в течение десятков секунд, если не минут, а не миллисекунд.