pymongo在聚合查询中包含javascript

2024-09-30 10:31:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前的任务是研究数据库,并尝试使用pymongo库进行各种查询,以研究对给定项目的适用性。在

我的时间戳以毫秒整数格式保存,我想做一个简单的按日销售汇总查询。我从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]
            }
        }
    }
}]

但是得到这个错误:

^{pr2}$

{js被解释为一个字符串,而不是由一个驱动程序来解释。如果我删除了封装的双引号,那么Python会尝试相应地解释这些代码和错误。这只是一个例子,我希望在以后的测试中在查询中包含更多的js,但是没有办法让它很好地与Python一起使用(尽管如此,我对Python也是相当陌生的)。在

有人知道如果:

  • 我假设错误发生是因为mongo解释 JS作为字符串并尝试直接求和?在
  • 如果我可以指示 mongo这是Python中的JS,没有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'}}}

Tags: iddata错误时间yearvisitsmonthedad
1条回答
网友
1楼 · 发布于 2024-09-30 10:31:21

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)

相关问题 更多 >

    热门问题