2014-11-22 4 views
0

Я написал запрос в mongodb, используя агрегацию, которая работает нормально, но каким-то образом она не работает должным образом в моем коде python с pymongo. Пожалуйста, совет, как исправить.PyMongo query on Aggregation

Монго запрос:

db.flights.aggregate([  
     { $match: { origin:"ATL", dest:"BOS",dayofweek: 3} }, 
     { $group: {   
      _id: {    
       origin:"$origin",    
       destination: "$dest"     
      }, 
      Failure: { $sum: { $cond : [{ $eq : ["$cancelled", 1]}, 1, 0]} }, 
      Success: { $sum: { $cond : [{ $eq : ["$cancelled", 0]}, 1, 0]} }, 
      Total: { $sum: 1 } 
     } }, 
     {$project:{Failure:1,Success:1, Total:1, FailPercent: { $divide: [ "$Failure", "$Total" ]}}}, 
     { $sort: { "_id.origin": 1, "_id.destination": 1 } } 
    ]) 

В питона код:

client = MongoClient("localhost", 27017) 
connect = client["database"]["collection"] 

pipe2 = [ { '$match': { 'origin':"ATL", 'dest':"BOS",'dayofweek': 3} }, 
{ '$group': {   
    '_id': {    
     'origin':"$origin",    
     'destination': "$dest"     
    }, 
    'Failure': { '$sum': { '$cond' : [{ '$eq' : ["$cancelled", 1]}, 1, 0]} }, 
    'Success': { '$sum': { '$cond' : [{ '$eq' : ["$cancelled", 0]}, 1, 0]} }, 
    'Total': { '$sum': 1 } 
} },{'$project':{'Failure':1,'Success':1, 'Total':1, 'FailPercent': { '$divide': [ "$Failure", "$Total" ]}}}, 
{ '$sort': SON([("_id.origin", 1), ("_id.destination", 1)]) } 
] 
result = connect.aggregate(pipeline=pipe2) 

результат запроса из PyMongo приходит неправильно, но в MongoDB правильно

+0

что является результат вы возвращаетесь? –

ответ

1

"Трубопроводный" переменная кажется ненужным , Не видя свою ошибку, и при условии, подключение к базе данных в порядке

Эта линия:

result = connect.aggregate(pipeline=pipe2) 

Должен быть просто:

result = connect.aggregate(pipe2) 

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

Коллекция:

{ '_id': 1, 'происхождение': 'АТЛ', 'Dest': 'BOS' , 'dayofweek': 3, 'cancel': 0}

{'_id': 2, 'origin': 'ATL', 'dest': 'BOS', 'dayofweek': 3, 'cancel': 0}

{ '_id': 3, 'происхождение': 'АТЛ', 'Dest': 'ЛК', 'день недели': 3, 'отменен': 1}

Код:

import pymongo 
from bson.son import SON 

connection_string = 'mongodb://localhost' 
connection = pymongo.MongoClient(connection_string) 
database = connection.myDatabase 

pipe2 = [ { '$match' : { 'origin' : 'ATL', 
         'dest' : 'BOS', 
         'dayofweek' : 3 
         } 
      }, 
      { '$group' : { '_id' : { 'origin' : '$origin', 
            'destination' : '$dest' 
           }, 
         'Failure' : { '$sum' : { '$cond' : [{ '$eq' : ['$cancelled', 1]}, 1, 0 ]} }, 
         'Success' : { '$sum' : { '$cond' : [{ '$eq' : ['$cancelled', 0]}, 1, 0 ]} }, 
         'Total' : { '$sum' : 1 } 
         } 
      }, 
      { '$project' : { 'Failure' : 1, 
          'Success' : 1, 
          'Total' : 1, 
          'FailPercent' : { '$divide' : [ '$Failure', '$Total' ] } 
          } 
      }, 
      { '$sort' : SON([('_id.origin', 1), ('_id.destination', 1)]) } 
     ] 

result = database.myCollection.aggregate(pipe2) 
print(result) 

выход:

{u'ok ': 1,0, u'result': [{u'Failure ': 1, u'_id': {и» происхождение ': u'ATL', u'destination ': u'BOS'}, u'FailPercent ': 0,333333333333, u'Success': 2, u'Total ': 3}]}

+0

Привет BMan..thnx для вашего ответа..так я понял это ясно, в соответствии с вами ненужный параметр вызывает ошибку? я попробую n поделиться результатами. И соединение с БД прекрасно, и я проверил это как первое. :) – miku

+1

@miku - Мое первое впечатление заключалось в том, что ненужный параметр может вызвать вашу ошибку. Однако я дал полный код, который я использовал, чтобы получить успешный результат, если это не так. Пожалуйста, разместите недопустимый вывод, который вы получаете, или ошибку, если у вас все еще есть проблемы. – BMan