2013-11-22 4 views
0

У меня есть две коллекции в MongoDB:MongoDB/PyMongo возвращает документы, которые соответствуют другой документ группировки

  1. Транспорт
  2. Тесты

Тесты содержит оценки для оценки, которая включает в себя свойство " _vehicle_id "

Мне нужно вернуть все транспортные средства, которые набрали более 70 (хранится как int), по крайней мере, в 3 из последних 5 тестов (используя свойство« unit_score ») ,

Я читал о поддокументах, сортировке, ограничении и т. Д., Но я в тупике, как добиться этого только в Монго. До сих пор мои усилия состояли в том, чтобы извлечь последние 5 результатов для всех людей, а затем перебрать их на Python, но это значительно неэффективно, когда я работаю с потенциально 10 000 тестов каждые 30 секунд ...

Так что я ищет способ для MongoDB/PyMongo ТОЛЬКО вернуть документы транспортного средства, которые имели более 3-х совпадений, где unit_score> 70.

В настоящее время у меня есть следующий код, который возвращает ObjectId() каждого соответствующего транспортного средства, но я хотел бы вместо этого вернуть объект Vehicle для каждого матча:

db.tests.aggregate([ 
{ "$match" : { 'statuscode' : '404', 'datetime' : { "$gte" : "2013-11-22 15:05:35" } } }, 
{ "$group" : { "_id" : "$_vehicle_id", "count" : { "$sum" : 1 }}}, 
{ "$match" : { "count" : { "$gt" : 3 } } } 
]) 

Дата будет динамичной (для e last x minutes), но теперь он статичен для тестирования.

Я посмотрел на «$ project», но я не уверен, правильно ли это для возвращения связанного объекта. _vehicle_id - это bson ObjectId(), поэтому я надеялся, что это будет так же просто, как db.vehicles.find_one («$ _ vehicle_id»), но я не боюсь ...

Спасибо за вашу помощь.

+1

Вы использовали ['aggregate'] (http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.aggregate)? – JohnnyHK

+0

Я не, @JohnnyHK ... Считаю, что это будет использоваться для поиска критериев тестирования, группы _vehicle_id, SUM моих совпадений, а затем возвращает список _vehicle_ids. Есть ли способ для этого вернуть реальные уникальные Транспортные средства в одном запросе? Спасибо :) –

+0

Или было бы лучше использовать MapReduce? –

ответ

0

У MongoDB нет поддержки для соединений, поэтому единственный запрос MongoDB (независимо от того, find или aggregate) может получить доступ только к документам в одной коллекции.

Так что в этом случае вы должны следовать вашему test.aggregate вызову, который получает идентификаторы автомобиля с db.vehicles.find({_id: {$in: vehicle_ids}}) запросом, чтобы получить документы транспортного средства для тех идентификаторов, где vehicle_ids является массивом идентификаторов вы строите из aggregate результатов.

+0

Это, похоже, не подходит для моих требований, как если бы я правильно понимал, сначала $ first раскрывает свойства первого элемента группы, который будет экземпляром Test, а не Vehicle, поэтому без «цвета» «и« модель », являющаяся частью тестового документа, мы не смогли бы получить доступ к свойствам Транспортного средства, поскольку мы не можем пересекать объекты в агрегации. Надеюсь, я ошибаюсь? –

+0

@ KarlM.W. Извините, мой плохой, я неправильно понял ваш вопрос. См. Обновленный ответ. – JohnnyHK

+0

Отлично, спасибо @JohnnyHK. Это результат, который я склонялся к своим собственным исследованиям, но надеялся, что есть более упорядоченный способ. –

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