菜单
文档breadcrumb arrow 插件breadcrumb arrow MongoDB 数据源breadcrumb arrow MongoDB 查询编辑器
Enterprise Grafana Cloud

MongoDB 查询编辑器

Grafana 为 MongoDB 提供了一个查询编辑器,支持与 MongoDB Shell (mongosh) 相同的语法,但存在以下限制:

  • 每个查询只能运行一个命令或查询。
  • 仅支持 findaggregate 读取命令。
  • 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 之前)中,日期算术常用于过滤文档。

示例

JavaScript
sample_mflix.movies.find({ $gte: new Date(new Date().setMonth(new Date().getMonth() - 3)) })

从 MongoDB 5.0 版本及更高版本开始,引入了新的操作符,例如$dateSubtract$dateAdd。这些操作符提供了更强大、更灵活的日期处理功能,尤其是在聚合查询中。

以下示例使用 $dateSubtract 过滤 “mflix” 样本数据集上的文档

JavaScript
sample_mflix.movies.aggregate([
  {
    $match: {
      $expr: {
        $gt: [
          "$released",
          {
            $dateSubtract: {
              startDate: "$$NOW",
              unit: "year",
              amount: 9
            }
          }
        ]
      }
    }
  }
])

该查询使用 MongoDB 原生日期待处理功能过滤过去 9 年内发行的电影。