MongoDB
快速导航
设置
要设置 MongoDB 连接,您至少需要提供一个 连接字符串 和一个 数据库名称。
连接字符串
-
最简单的形式:
mongodb://username:password@hostname:port/dbname
-
启用 SSL:
mongodb://username:password@hostname:port/dbname?ssl=true
-
启用 SSL 并使用自签名证书(禁用证书验证):
mongodb://username:password@hostname:port/dbname?ssl=true&ssl_cert_reqs=CERT_NONE
如果需要,您可以在查询字符串中传递其他连接选项。请参阅 [MongoDB 文档](https://docs.mongodb.com/manual/reference/connection-string /#connection-options) 获取完整详细信息。
您可能会注意到,数据源配置中有一个单独的“数据库名称”字段,并且我们也将其包含在连接字符串中。这通常在 MLab 等共享主机上是必需的。
Redash V10 添加了 “用户名” 和 “密码” 字段。其目的是允许用户在数据源配置中保持 MongoDB 密码的私密性。以前这是不可能的,因为密码必须嵌入到 连接字符串 中,而该字符串在 UI 和 REST API 中以纯文本形式可用。
从 Redash V10 开始,如果用户提供 “用户名” 和/或 “密码” 配置字段,Redash 将在创建 PyMongo 客户端时使用它们来覆盖连接字符串中设置的任何内容。这允许现有的、预先修补的 MongoDB 数据源仍然可以工作,同时允许新的/修改的 MongoDB 数据源具有机密凭据。
MongoDB Atlas
我们遇到过用户连接到 MongoDB Atlas 免费套餐帐户的问题,因为它们位于共享环境中。为了获得最佳结果,请使用以下格式的连接字符串:
mongodb+srv://<user>:<password>@<subdomain>.mongodb.net/<database>?retryWrites=true
故障排除
错误:“SSL 握手失败:[SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败”
当您的 MongoDB 服务器使用自签名证书时,通常会发生这种情况。您可以切换到正确签名的证书,或者只是将 ssl_cert_reqs=CERT_NONE
选项添加到您的连接字符串中。
将您的 MongoDB 查询编写为 JSON 对象。在执行期间,Redash 将其转换为 db.collection.find()
调用或 db.collection.aggregate()
调用。以下是您的 JSON 对象如何映射并发送到 MongoDB
MongoDB 令牌 | 在 Redash 中写入的位置 |
---|---|
数据库 |
在数据源设置屏幕上 |
集合 |
在您的查询对象中添加一个 collection 键 |
查询 |
在您的查询对象中添加一个 query 键 |
投影 |
在您的查询对象中添加一个 fields 键 |
.sort() 方法 |
在您的查询对象中添加一个 sort 键 |
.skip() 方法 |
在您的查询对象中添加一个 skip 键 |
.limit() 方法 |
在您的查询对象中添加一个 limit 键 |
db.collection.count() 方法 |
在您的查询对象中使用具有任何值的 count 键 |
您用于每个键的值将作为参数未经修改地传递给 MongoDB。
查询
查询示例
简单查询示例
{
"collection": "my_collection",
"query": {
"type": 1
},
"fields": {
"_id": 1,
"name": 2
},
"sort": [{
"name": "date",
"direction": -1
}]
}
在 Javascript 中等效的查询将写为:db.my_collection.find({"type": 1}, {"_id": 1, "name": 2}).sort([{"name": "date","direction": -1}])
计数查询示例
{
"collection": "my_collection",
"count": true
}
聚合
聚合使用与 PyMongo 中使用的语法类似的语法。但是,为了支持正确的排序顺序,它对 “$sort” 操作使用常规列表,该操作在执行之前会转换为 SON(排序字典)对象。
聚合查询示例
{
"collection": "things",
"aggregate": [{
"$unwind": "$tags"
}, {
"$group": {
"_id": "$tags",
"count": {
"$sum": 1
}
}
}, {
"$sort": [{
"name": "count",
"direction": -1
}, {
"name": "_id",
"direction": -1
}]
}]
}
MongoDB 扩展 JSON 支持
我们支持 MongoDB 扩展 JSON 以及我们自己的扩展 - $humanTime
{
"collection": "date_test",
"query": {
"lastModified": {
"$gt": {
"$humanTime": "3 years ago"
}
}
},
"limit": 100
}
它接受类似上述内容的可读字符串(“3 年前”、“昨天” 等)或时间戳。
当将日期或日期/时间类型的 查询参数与 MongoDB 一起使用时,也需要 $humanTime
函数,这是由于 Redash 使用的格式与 MongoDB 期望的格式之间的差异所致。
当使用日期(或日期范围)参数时,请使用 $humanTime
对象包装它:{{param}}
变为 {"$humanTime": "{{param}} 00:00"}
( 00:00
后缀仅在日期参数中需要,对于日期时间参数,您应该跳过它)。
MongoDB 过滤
您可以通过在列的末尾添加 '::filter' 关键字来向 Mongo 查询添加过滤器。
{
"collection": "zipcodes",
"aggregate": [{
"$project": {
"_id": "$_id",
"city": "$city",
"loc": "$loc",
"pop": "$pop",
"state::filter": "$state"
}
}]
}
上面的示例将显示一个“状态”列,并允许您在此列上进行筛选。
故障排除
排序超出 104857600 字节的内存限制
排序超出 104857600 字节的内存限制,但未选择外部排序。中止操作。传递 allowDiskUse:true 以选择。
在 MongoDB 中,内存排序的限制为 100M,要执行大型排序,您需要启用 allowDiskUse
选项以将数据写入临时文件进行排序。
要启用 allowDiskUse
选项,只需将该选项添加到您的查询中即可
{
...
"allowDiskUse": true
}