关于 python:pymongo 在聚合查询中包含 javascript | 珊瑚贝

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 “new Date(0)” 被 mongo 驱动程序解释为字符串,而不是作为 js 应用。如果我删除封装的倒双引号,那么 Python 会尝试相应地解释此代码和错误。这只是一个例子,我想在以后的测试中在查询中包含更多的 js,但看不到一种让它与 Python 很好地配合的方法(我说我对 Python 也很陌生)。

有人知道吗:

  • 我假设发生错误是正确的,因为 mongo 解释了
    JS 作为字符串并尝试直接求和?
  • 如果我能指出
    mongo 这是来自 Python 的 JS,没有 Python 试图解释
    代码?

到目前为止,我已经尝试通过 Google 以及单引号和双引号的各种组合进行搜索。

如果需要,下面粘贴几行随机生成的测试数据:

谢谢,

詹姆斯

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)

  • 谢谢 A. Jesse Jiryu Davis,工作,我学到了。唯一需要的调整是包括 import pytz 和调整纪元 epoch = datetime.datetime.fromtimestamp(0, pytz.utc)


来源:https://www.codenong.com/43523688/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9258.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?