Как сопоставить элементы массива в документе с любым другим массивом - агрегация mongodb - PullRequest
0 голосов
/ 10 апреля 2020

В mongoDB у меня есть 3 документа в коллекции, например (пожалуйста, игнорируйте отсутствующие '_id') :

[
  {
    "Id": "398ae455-2845-43e5-b2f2-e7137e766393",
    "Case": {
      "Id": "0dfd8c90-53b6-4d41-9bf9-7bec5d2e453e",
      "Skills": [
        {
          "Id": "SKL01",
          "Type": "CLI01_OPE01_SKL01"
        },
        {
          "Id": "SKL02",
          "Type": "CLI01_OPE01_SKL02"
        }
      ]
    }
  },
  {
    "Id": "04c6b532-50cd-462a-bfd5-6438862a0241",
    "Case": {
      "Id": "f9dbf8d2-7a2e-4ba2-b420-a6372d8f116d",
      "Skills": [
        {
          "Id": "SKL03",
          "Type": "CLI01_OPE01_SKL03"
        },
        {
          "Id": "SKL04",
          "Type": "CLI01_OPE01_SKL04"
        }
      ]
    }
  },
  {
    "Id": "a3205573-9519-4555-a5f1-2a2263a37466",
    "Case": {
      "Id": "7326a5ed-203f-4231-a6fa-928d1a704919",
      "Skills": [
        {
          "Id": "SKL04",
          "Type": "CLI01_OPE01_SKL04"
        },
        {
          "Id": "SKL06",
          "Type": "CLI01_OPE01_SKL06"
        }
      ]
    }
  }
]

Предоставление массива запросов :

[
  {
    "Id": "SKL01",
    "Type": "CLI01_OPE01_SKL01"
  },
  {
    "Id": "SKL03",
    "Type": "CLI01_OPE01_SKL03"
  }
]

Я хочу получить следующие результаты:

{"Ids": ["398ae455-2845-43e5-b2f2-e7137e766393","04c6b532-50cd-462a-bfd5-6438862a0241"]}

Поэтому мне нужно получить Id документов, содержащихся в Case.Skills любые элементов моего массива запросов.

Как я могу выполнить sh это с помощью запроса агрегации?

1 Ответ

1 голос
/ 10 апреля 2020

Попробуйте запрос ниже:

db.collection.aggregate([
  /** '$match' to filter docs & '$in' is kind of or condition between multiple input criteria */
  {
    $match: {
      "Case.Skills": {
        $in: [
          {
            Id: "SKL01",
            Type: "CLI01_OPE01_SKL01"
          },
          {
            Id: "SKL03",
            Type: "CLI01_OPE01_SKL03"
          }
        ]
      }
    }
  },
  /** Group on empty will group all docs & push `Id`s to Id field (Use '$addToSet' instead of '$push' to eliminate duplicates) */
  {
    $group: { _id: "", Id: { $push: "$Id" } }
  },
  /** Optional */
  {
    $project: { _id: 0 }
  }
]);

Тест: MongoDB-Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...