2015-10-29 2 views
0

скажем, у нас есть коллекция пользователей, и за каждым пользователем следует другой пользователь. если я хочу найти пользователей, которые НЕ следуют за мной, мне нужно сделать что-то вроде:запрос слишком большой вопрос с mongodb

db.users.find ({_ id: {$ nin: followers_ids}});

Если количество последовательных_идей огромно, скажем, пользователей 100 тыс., Mongodb начнет говорить, что запрос слишком велик, плюс отправка большого количества данных по сети, чтобы сделать запрос не очень хорошим. каковы наилучшие методы для выполнения этого запроса без отправки всех этих идентификаторов по сети?

ответ

1

Я рекомендую вам ограничить количество результатов запроса для уменьшения сетевого спроса. Согласно Docs,

Показатели MongoDB возвращают результаты в виде групп из нескольких документов. Если вы знаете количество желаемых результатов, вы можете уменьшить спрос на сетевые ресурсы, выпустив метод limit().

Это обычно используется в сочетании с операциями сортировки. Для Например, если вам нужно только 50 результатов запроса к пользователям коллекции, вы бы выполнить следующую команду:

db.users.find({$nin : followers_ids}).sort({ timestamp : -1 }).limit(50) 

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

Рекомендация реструктурировать Followers схемы

Я рекомендовал бы вам перестроить ваши документы пользователя, если последователи будут расти в большом количестве. В настоящее время схема пользователь может быть такой:

{ 
    _id: ObjectId("123"), 
    username: "jobs", 
    email: "[email protected]", 
    followers: [ 
     ObjectId("12345"), 
     ObjectId("12375"), 
     ObjectId("12395"), 
    ] 
} 

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

Возможно, вы захотите продолжить нормализацию своих подписчиков. Вы можете сохранить коллекцию, которая соответствует followee последователей с документами, которые выглядят так:

{ 
    _id: ObjectId("123"),//Followee's "_id" 
    followers: [ 
     ObjectId("12345"), 
     ObjectId("12375"), 
     ObjectId("12395"), 
    ] 
} 

Это будет держать ваши пользовательские документы тонким, но будет принимать дополнительный запрос, чтобы получить последователь. Поскольку массив «последователей» изменяется в размере, вы можете включить стратегию распределения userPowerOf2Sizes для уменьшения фрагментации и перемещения.

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