2017-04-20 77 views
0

我目前的任務是研究數據庫,並嘗試使用pymongo庫來調查對給定項目的適用性的各種查詢。pymongo在綜合查詢中包含javascript

我的時間戳以毫秒整數格式保存,我想按日彙總查詢做一個簡單的銷售。我從here (answer by Alexandre Russel)瞭解到,由於時間戳未以BSON格式上傳,因此我無法使用日期和時間函數來創建垃圾箱,但可以使用嵌入式JavaScript處理時間戳。

因此我寫了下面的查詢:

[{ 
    "$project": { 
     "year": { 
      "$year": { 
       "$add": ["new Date(0)", "$data.horaContacto"] 
      } 
     }, 
     "month": { 
      "$month": { 
       "$add": ["new Date(0)", "$data.horaContacto"] 
      } 
     } 
    } 
}, { 
    "$group": { 
     "_id": { 
      "year": "$year", 
      "month": "$month" 
     }, 
     "sales": { 
      "$sum": { 
       "$cond": ["$data.estadoVenta", 1, 0] 
      } 
     } 
    } 
}] 

但得到這個錯誤:

pymongo.errors.OperationFailure: exception: $add only supports numeric or date types, not String 

我認爲,什麼情況是,JS "new Date(0)"正在被蒙戈駕駛員解釋一個字符串,不適用於js。如果我刪除封裝倒排雙引號,則Python會嘗試相應地解釋此代碼和錯誤。這只是一個例子,我希望在未來的測試中包含更多的js查詢,但是無法找到一種方式讓它能夠很好地與Python一起玩(據說我對Python也很陌生)。

是否有人知道:

  • 我在假設錯誤出現正確,因爲蒙戈解釋 JS作爲一個字符串,並試圖直接概括?
  • 如果我可以指示 mongo這是來自Python的JS,沒有Python試圖解釋 的代碼?

到目前爲止,我已經嘗試通過谷歌搜索和單引號和雙引號的各種組合。

粘貼下面是如果需要隨機生成的測試數據的幾行:

謝謝,

詹姆斯

{'_id': 0,'data': {'edad': '74','estadoVenta': True,'visits': [{'visitLength': 1819.349246663518,'visitNo': 1,'visitTime': 1480244647948.0}],'apellido2': 'Aguilar','apellido1': 'Garcia','horaContacto': 1464869545373.0,'preNombre': 'Agustin','_id': 0,'telefono': 630331272,'location': {'province': 'Aragón','city': 'Zaragoza','type': 'Point','coordinates': [-0.900203, 41.747726],'country': 'Spain'}}}, 
{'_id': 1,'data': {'edad': '87','estadoVenta': False,'visits': [{'visitLength': 2413.9938072105024,'visitNo': 1,'visitTime': 1465417353597.0}],'apellido2': 'Torres','apellido1': 'Acosta','horaContacto': 1473404147769.0,'preNombre': 'Sara','_id': 1,'telefono': 665968746,'location': {'province': 'Galicia','city': 'Cualedro','type': 'Point','coordinates': [-7.659321, 41.925328],'country': 'Spain'}}}, 
{'_id': 2,'data': {'edad': '48','estadoVenta': True,'visits': [{'visitLength': 2413.9938072105024,'visitNo': 1,'visitTime': 1465415138597.0}],'apellido2': 'Perez','apellido1': 'Sanchez','horaContacto': 1473404923569.0,'preNombre': 'Sara','_id': 2,'telefono': 665967346,'location': {'province': 'Galicia','city': 'Barcelona','type': 'Point','coordinates': [-7.659321, 41.925328],'country': 'Spain'}}} 

回答

2

MongoDB的聚合框架不能使用任何的Javascript。您必須使用BSON在您的聚合管道中指定所有數據。 PyMongo可以在標準的Python日期時間轉換爲BSON,你可以把它作爲聚集管道的一部分,就像這樣:

import datetime 

epoch = datetime.datetime.fromtimestamp(0) 
pipeline = [{ 
    "$project": { 
     "year": { 
      "$year": { 
       "$add": [epoch, "$data.horaContacto"] 
      } 
     }, 
     # the rest of your pipeline here .... 
    } 
}] 

cursor = db.collection.aggregate(pipeline) 
+1

感謝A.傑西Jiryu戴維斯,曾和我learn't。只需要調整'import pytz'並調整epoch就好''epoch = datetime.datetime.fromtimestamp(0,pytz.utc)' –