MongoDB 查询编辑器
Grafana 为 MongoDB 提供了一个查询编辑器,支持与 MongoDB Shell (mongosh) 相同的语法,但存在以下限制:
- 每个查询只能运行一个命令或查询。
- 仅支持
find
和aggregate
读取命令。 ISODate
是唯一受支持的对象构造函数。
有关为 MongoDB shell 编写脚本的介绍,请参阅 MongoDB 文档中的编写脚本。您可以在 Grafana 的查询编辑器中以与在 MongoDB shell 中相同的方式创建查询。
示例
sample_mflix.movies.aggregate([
{"$match": { "year": {"$gt" : 2000} }},
{"$group": { "_id": "$year", "count": { "$sum": 1 }}},
{"$project": { "_id": 0, "count": 1, "time": { "$dateFromParts": {"year": "$_id", "month": 2}}}}
]
).sort({"time": 1})
附加语法
编辑器通过数据库选择扩展了 MongoDB Shell 语法,您可以使用数据库名称代替 db
。例如,sample_mflix.movies.find()
。您仍然可以使用 db
指代连接字符串中的默认数据库。
它还通过聚合排序进行了扩展。排序通常发生在聚合管道内部。扩展语法可以在 aggregate
上使用,类似于 find
。例如,sample_mflix.movies.aggregate({}).sort({"time": 1})
。
注意
MongoDB 不会使用此语法执行排序。排序发生在从集合检索结果之后。
带有点的集合
要查询名称中包含点 (.) 的集合,请使用以下语法:
my_db.getCollection("my.collection").find({})
键盘快捷键
按下 Ctrl+Space 显示代码完成提示,该提示在数据库、集合、查询方法或聚合方法名称后输入 .
后显示。按下 Cmd + S 运行查询。
按时间序列查询
通过将日期字段别名为 time
来创建时间序列查询。
注意
您可以将非日期字段转换为日期字段并将其别名为
time
来创建时间序列查询。
以下查询使用 MongoDB 的 $dateFromParts 管道操作符将 int
字段 year
转换为一个日期,并将其投影为 time
sample_mflix.movies.aggregate([
{"$match": { "year": {"$gt" : 2000} }},
{"$group": { "_id": "$year", "count": { "$sum": 1 }}},
{"$project": { "_id": 0, "count": 1, "time": { "$dateFromParts": {"year": "$_id", "month": 2}}}}
]
).sort({"time": 1})
如果您想按指标对时间序列进行分组,请投影一个名为 __metric
的字段。
以下查询使用 __metric
按电影评级显示电影随时间变化的计数
sample_mflix.movies.aggregate([
{"$match": { "year": {"$gt" : 2000}}},
{"$group": { "_id": {"year":"$year", "rated":"$rated"}, "count": { "$sum": 1 } }},
{"$project": { "_id": 0, "time": { "$dateFromParts": {"year": "$_id.year", "month": 2}}, "__metric": "$_id.rated", "count": 1}}
]
).sort({"time": 1})
诊断
MongoDB 提供了诊断命令,用于帮助监控和排查数据库性能、健康状况和操作。有关诊断命令的信息,请参阅 MongoDB 文档中的诊断命令。
插件支持以下 MongoDB 诊断命令:
buildInfo
connPoolStats
connectionStatus
dbStats
getLog
hostInfo
lockInfo
replSetGetStatus
serverStatus
stats
宏
为了简化语法和实现动态时间,您可以编写包含宏的查询。MongoDB 插件支持以下宏:
宏示例 | 描述 |
---|---|
$__timeFrom() | 将值替换为当前活动时间选择的开始时间。示例:FROM_UNIXTIME(1494410783) |
$__timeTo() | 将值替换为当前活动时间选择的结束时间。示例:TO_UNIXTIME(1494410983) |
查询中的动态日期
从版本 1.14.2 开始,Grafana MongoDB 插件不再直接在查询编辑器中支持日期算术操作。在早期版本的 MongoDB(版本 5 之前)中,日期算术常用于过滤文档。
示例
sample_mflix.movies.find({ $gte: new Date(new Date().setMonth(new Date().getMonth() - 3)) })
从 MongoDB 5.0 版本及更高版本开始,引入了新的操作符,例如$dateSubtract
和 $dateAdd
。这些操作符提供了更强大、更灵活的日期处理功能,尤其是在聚合查询中。
以下示例使用 $dateSubtract
过滤 “mflix” 样本数据集上的文档
sample_mflix.movies.aggregate([
{
$match: {
$expr: {
$gt: [
"$released",
{
$dateSubtract: {
startDate: "$$NOW",
unit: "year",
amount: 9
}
}
]
}
}
}
])
该查询使用 MongoDB 原生日期待处理功能过滤过去 9 年内发行的电影。