2017-04-20 78 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)' –