pymongo include javascript in aggregate query
我目前的任务是研究数据库,并正在尝试使用 pymongo 库进行各种查询,以调查给定项目的适用性。
我的时间戳以毫秒整数格式保存,我想做一个简单的按日销售聚合查询。我从这里了解到(Alexandre Russel 的回答),由于时间戳不是以 BSON 格式上传的,我不能使用日期和时间函数来创建 bin,但可以使用嵌入式 javascript 操作时间戳。
因此,我编写了以下查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | [{ "$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] } } } }] |
但是得到这个错误:
1 | pymongo.errors.OperationFailure: exception: $add only supports numeric or date types, not String |
我认为发生的事情是 js 有人知道吗: 到目前为止,我已经尝试通过 Google 以及单引号和双引号的各种组合进行搜索。
JS 作为字符串并尝试直接求和?
mongo 这是来自 Python 的 JS,没有 Python 试图解释
代码?
如果需要,下面粘贴几行随机生成的测试数据:
谢谢,
詹姆斯
1 2 3 | {'_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,您可以将其作为聚合管道的一部分发送,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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) |