В MongoDB, как мне запросить коллекцию историй, основанную только на историях, в которых есть имя пользователя в поле массива? - PullRequest
1 голос
/ 10 декабря 2011

Этот вопрос во многом проверяет здравомыслие. Я организовал БД по коллекции историй и по коллекции пользователей. В каждой истории есть множество «избирателей», которые проголосовали за этот объект. У каждого пользователя также есть массив «друзей». Что я хочу сделать, так это искать только те истории, за которые проголосовали мои друзья, но, кроме того, можно отсортировать их по количеству друзей, проголосовавших по этому вопросу.

Мое первоначальное мышление таково: индексировать поле избирателей в сюжетных объектах. Затем карта уменьшает запрос только для историй в этом проиндексированном поле избирателя, используя массив «друзей» из пользовательского документа, с функцией группировки для подсчета количества раз, когда каждая история появляется? Не уверен, что это правильно .. Я также не уверен, если это будет масштабироваться .. Мысли и предложения приветствуются.

1 Ответ

1 голос
/ 11 декабря 2011

Я думаю, что вам следует использовать фоновый рабочий, который периодически выполняет ваш 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 не будет очень быстрым, если ваши коллекции станут большими, ожидайте, что это будет выполняться в течение десятков секунд, если не минут, а не миллисекунд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...