

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 连接到 MongoDB 数据来源
<a name="AMG-mongodb-datasource"></a>

 通过 MongoDB 数据来源，您可以在 Amazon Managed Grafana 中可视化来自 MongoDB 的数据。

**注意**  
此数据来源仅适用于 Grafana Enterprise。有关更多信息，请参阅 [管理对 Enterprise 插件的访问](upgrade-to-enterprise-plugins.md)。  
此外，在支持版本 9 或更高版本的工作区中，此数据来源可能需要您安装相应的插件。有关更多信息，请参阅 [使用插件扩展您的工作区](grafana-plugins.md)。

## 用法
<a name="mongo-usage"></a>

### 查询编辑器
<a name="mongo-query-editor"></a>

 查询编辑器支持与 MongoDB Shell 相同的语法，但有一些限制：\$1 只能运行一条命令/查询。\$1 仅支持读取命令：**查找**和**聚合** \$1 不支持大*多数* Object 构造函数（支持除外）**ISODate** 

 编辑器通过以下方式扩展了 MongoDB Shell 的语法：
+  **数据库选择**：您可以提供数据库名称，来代替普通的“db”：
**注意**  
您仍然可以使用“db”。它将引用连接字符串中的默认数据库。

  ```
  sample_mflix.movies.find()
  ```
+  **聚合排序**：通常，排序在聚合管道中的一个步骤中进行，但是 MongoDB Atlas 免费套餐不允许排序。我们扩展了语法，允许使用免费套餐的用户进行排序。
**注意**  
MongoDB 不会使用这种语法执行排序。排序发生在从集合中查询结果之后。

  ```
  sample_mflix.movies.aggregate({}).sort({"time": 1})
  ```
+  在空白编辑器中，按 **Ctrl \$1 空格键**将显示所有可用数据库的选择。
+  在数据库后输入一个点，将显示该数据库所有可用集合的选择。
+  在集合后输入一个点，将显示可用的查询方法。
+  在查询方法后输入一个点，将显示其他功能：排序/限制。

#### 运行查询
<a name="mongo-running-the-query"></a>

 按 **Cmd \$1 S** 运行查询 

### 时间序列
<a name="mongo-time-series"></a>

 在可视化时间序列数据时，插件需要知道使用哪个字段作为时间。只需将字段投影为别名为“time”的字段即可。该字段的数据类型必须是日期。

 您可以将非日期数据类型强制转换为日期数据类型。这样做将允许使用非日期字段作为时间序列时间。以下示例说明如何使用 mongo dateFromParts DB \$1 管道运算符将 int 字段 “year” 转换为预计为 “时间” 的日期。

```
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})
```

### 诊断
<a name="mongo-diagnostics"></a>

 [诊断命令](https://docs.mongodb.com/manual/reference/command/nav-diagnostic/) 

 目前支持以下诊断命令：“统计信息”、“服务器状态”、“状态”、“getLog”、“”、“Connection replSetGet Status”、“buildInfo”、connPoolStats “dbStats”、“hostInfo”、“HostInfo”、“LockInfo” 

 示例：

```
admin.connectionStatus()  // run the connectionStatus command
admin.connectionStatus({"authInfo.authenticatedUserRoles": 1})  // run and only return the "authInfo.authenticatedUserRoles" field
admin.connPoolStats({arg: "pool"})  // run the connPoolStats command and pass 1 argument
admin.serverStatus({args: {repl: 0, metrics:0}})  // run the serverStatus command and pass multiple args
```

### 宏
<a name="mongo-macros"></a>

 您可以在查询中引用控制面板的时间范围。
+ ` $__timeFrom `：引用控制面板开始时间的宏
+ ` $__timeTo `：引用控制面板结束时间的宏

```
          $__timeTo -  ``` sample_mflix.movies.find({released: {$gt:
          "$__timeFrom"}}).sort({year: 1})
```

#### 模板变量
<a name="mongo-variables"></a>

MongoDB 支持“复合变量”的概念，让您可以将一个变量用作多个变量，以执行复杂的多键筛选。

要创建复合变量，请使用以下划线分隔变量的命名约定（必须以下划线开头）：`_var1_var2`。查询时，响应格式必须为：`val1-val2`

**示例：我想根据电影名称和年份筛选结果。**

1. 创建一个类型为 Query 的变量：`_movie_year`

1. 设置该变量查询，让其返回一个包含电影年份属性的项目数组，如下所示。

   ```
   // Example sample_mflix.movies.aggregate([
             {"$match": {year: {"$gt": 2011}}},
             {"$project": {_id: 0, movie_year: {"$concat":
             ["$title", " - ", {"$toString":"$year"}]}}}
             ])
   ```

   ```
    // [{"movie-year": "Ted - 2016"},
             {"movie-year": "The Terminator -
             1985"}]
   ```

1. 现在，您可以在查询中使用语法“\$1\$1variable”，将“Movie”和“Year”作为单独的模板变量引用。

##### 使用临时筛选条件
<a name="mongo-adhoc"></a>

除了可以使用任意名称的标准“临时筛选条件”类型变量外，还必须创建第二个辅助变量。该变量应为“常量”类型，名称为“mongodb\$1adhoc\$1query”，其值必须与查询编辑器兼容。查询结果将用于填充可选择的筛选条件。您可以选择隐藏该变量，因为它没有其他用途。

```
          sample_mflix.movies.aggregate([
          {"$group": { "_id": "$year"}},
          {"$project": { "year": "$_id","_id":
          0 }} ] )
```