2014-11-22 148 views
0

我寫了一個使用聚合的mongodb查詢工作正常,但不知何故它不能在我的Python代碼與pymongo正常工作。請諮詢如何糾正。PyMongo關於聚合查詢

蒙戈查詢:

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 } } 
    ]) 

在Python代碼:

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

什麼是結果你回來了? – 2014-11-24 09:35:37

回答

1

的 「管道」 變量似乎沒有必要。沒有看到你的錯誤,並假設你的數據庫連接是好的

這條線:

result = connect.aggregate(pipeline=pipe2) 

應該僅僅是:

result = connect.aggregate(pipe2) 

從所給的信息複製您的收藏後,這個工作爲了我。下面是完整的代碼(我的連接看起來比你有點不同以及)

收藏:

{ '_id':1, '出身': 'ATL', 'DEST': 'BOS' ,'dayofweek':3,'取消':0}

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

{ '_id':3 '原點': 'ATL', 'DEST': 'BOS', '星期幾':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」起源':u'ATL',u'destination':u'BOS'},u'FailPercent':0.333333333333,u'Success':2,u'Total':3}]}

+0

您好BMan..thnx您的答覆..所以我明白了這一點,根據你的不必要的參數是導致錯誤?我會嘗試n分享結果。和DB的連接是好的,我檢查了第一件事。 :) – miku 2014-11-26 09:23:25

+1

@miku - 我的第一印象是,不必要的參數可能會導致你的錯誤。但是,我給了我用來獲得成功輸出的完整代碼,以防事件不成功。如果您仍然遇到問題,請發佈您收到的無效輸出或錯誤。 – BMan 2014-12-01 15:50:04