[英]pymongo include javascript in aggregate query
我目前负责研究数据库,并正在尝试使用pymongo库进行各种查询,以调查给定项目的适用性。
我的时间戳以毫秒整数格式保存,我想按日汇总查询进行简单的销售。 我从这里了解到(由于Alexandre Russel的回答) ,因为时间戳不是以BSON格式上载的,所以我不能使用日期和时间函数来创建bin,但是可以使用嵌入式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
我认为发生的事情是mongo驱动程序将js "new Date(0)"
解释为字符串,而不是作为js应用。 如果删除封装的双引号,Python会尝试解释此代码并相应地出错。 这只是一个例子,我想在将来的测试中在查询中包含更多的js,但找不到让它与Python完美配合的方法(尽管我也对Python相当陌生)。
有人知道吗:
到目前为止,我已经尝试通过Google以及单引号和双引号的各种组合进行搜索。
如果需要,请在下面粘贴几行随机生成的测试数据:
谢谢,
詹姆士
{'_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'}}}
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.