2013-04-28 4 views
1

Я использую MongoDB, и я закончил с двумя коллекциями (непреднамеренно).Как запросить две коллекции одновременно?

Первая коллекция (образец) имеет 100 миллионов записей (Tweets) со следующей структурой:

{ 
"_id" : ObjectId("515af34297c2f607b822a54b"), 
"text" : "bla bla ", 
"id" : NumberLong("314965680476803072"), 
"user" : 
     { 
     "screen_name" : "TheFroooggie", 
     "time_zone" : "Amsterdam", 
     }, 
} 

Вторая коллекция (пользователей) с 30 миллионов записей уникальных пользователей из коллекции чириканье и, похоже, это

{ "_id" : "000000_n", "target" : 1, "value" : { "count" : 5 } } 

где _id в коллекции пользователей является user.screen_name из коллекции чириканья, цель их статус (спамер или нет), и, наконец, value.count этого числа пользователя появился в нашем первом сбор (образец) коллекции (e .г. количество захваченных твитов)

Теперь я хотел бы сделать следующий запрос:

Я хотел бы вернуть все документы из коллекции образцов (твиты), где пользователь имеет целевое значение = 1

Другими словами, я хочу, например, вернуть все твиты всех спамеров.

+1

Запросы могут действовать только по одной коллекции за раз. Нет объединений. Ther - некоторые рамки, которые могут заставить его казаться, что есть объединения, но это иллюзия, и на самом деле сделано много запросов. В StackOverflow есть много вопросов/ответов. – WiredPrairie

+0

Спасибо WiredPrairie за ваш комментарий. Я изучил некоторые решения в StackOverflow, многие из них были недостаточно эффективны, чтобы учесть количество записей, которые у меня есть, или они не отвечали моим потребностям. Интересно, действительно ли на самом деле есть третья коллекция с «пользователями» (вторая коллекция) и их твитами в качестве поддокументов. Тем не менее, мне нужна эффективная реализация, чтобы закончить это в разумные сроки, и я буду признателен за любую помощь, поскольку я новичок в этом нереляционном мире – amaatouq

+0

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

ответ

1

Поскольку вы получаете твиты, вы можете добавить их в коллекцию. Использование информации об авторе в качестве ключа в части запроса документа запроса. В документе обновления может использоваться оператор $addToSet, чтобы поместить твит в массив твитов. Вы получите коллекцию, в которой есть автор и массив твитов. Затем вы можете классифицировать спамер для каждого автора и иметь связанные с ним твиты.

Таким образом, вы бы в конечном итоге делает что-то вроде этого:

db.samples.update({"author":"joe"},{$addToSet:{"tweets":{"tweet_id":2}}},{upsert:true}) 

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

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

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

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

+0

Добро пожаловать в StackOverflow. Обратите внимание, что подписи и подписки не рекомендуется ни по вопросам, ни по ответам. :-) –

+1

Это очень плохая схема для производительности - каждый пользовательский документ будет расти неограниченным, а также получить последний твит от кого-то, кого вы должны запросить по всему подмножеству своих твитов. Нет ничего принципиально неправильного в том, чтобы иметь две коллекции, как это делает OP, они просто должны иметь стратегию для запросов, которые должны получать доступ к информации от обоих (либо двух запросов, либо денормализации некоторой информации). –

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