1

我的 MongoDb 中有两个集合

  1. metricCollectionForms
  2. 公制

文档看起来像metricCollectionForms这样

{
    "_id": ObjectId("5ea25f38afd94f0008d4e6f2"),
    "approverId": "f08ba2aa-4597-41f0-9e6c-cebf1715ba30",
    "formName": "Test Form",
    "formId": "d56209a1-4df0-48de-b6cf-d1ee50200936",
}

我从上面的文档中跳过了一些属性,因为它们与这个问题无关。

至于metric一个典型的文件看起来像这样

{
    "_id": ObjectId("5ea27955bae4900008d996ba"),
    "name": "Test Metric",
    "type": "INTERNAL",
    "formula": [
        {
          "type": "FORM_FIELD",
          "formId": "d56209a1-4df0-48de-b6cf-d1ee50200936",
          "formFieldId": "dca2bacf-2cbd-480d-8289-6f3050b635fb"
        },
      {...}, {...}
    ],
    "formulaLabel": "monthly_production",
    "createdBy": "f08ba2aa-4597-41f0-9e6c-cebf1715ba30",
    "isApproved": true,
    "isActive": false
}

您会注意到文档的公式数组字段中引用了formIdfrom 的值。metricCollectionFormsformIdmetric

因此,一个度量可以在其对象的公式数组中使用多种形式。

我正在尝试获取表单列表,并在该列表中返回度量名称数组,其中

metric.formula.formId = formId(表单)AND metric.isActive = true AND metric.isApproved = true

到目前为止,我的聚合查询看起来像这样:

{
    $lookup: {
        from: "metric",
        localField: "formId",
        foreignField: "formula.formId",
        as: "metrics"
    }
},
{
    $addFields: {
        metrics: "$metrics.name"
    }
}

现在它确实返回了一个包含所有指标名称的数组,但我不知道如何在 $lookup 上应用 isApproved 和 isActive true 条件。

我尝试做 $pipeline / $match 等,但似乎没有任何效果。此外,该解决方案应该与 Mongo 3.6 兼容,因为我在 AWS DocumentDb(仅支持 3.6)中使用它。

4

2 回答 2

1

直到 MongoDB 4.2 才可以使用管道形式的查找。

3.6 中的最佳选择是在查找之后使用带有$filter$addFields表达式的阶段来从数组中删除不需要的元素。

于 2020-04-27T06:04:02.897 回答
0

以下应该适用于您的示例。

{
    $lookup: {
        from: "metric",
        localField: "formId",
        foreignField: "formula.formId",
        as: "metrics"
    }
},
{
    $match: {
       $and: {[
               "metrics.isApproved": true,
               "metrics.isActive": true
              ]}
    }
}

{ $match: {"metrics.isApproved": 'MA'}},

于 2022-02-21T18:19:19.733 回答