Мангустный агрегат с вложенной коллекцией - PullRequest
1 голос
/ 21 октября 2019

У меня есть следующие схемы.

Первый: AdditionalFieldSchema

const AdditionalFieldSchema = new Schema({
  names: [
    {
      type: Schema.Types.ObjectId,
      ref: "multiLanguageContent",
      required: true
    }
  ],
  ...
});

Второй: MultiLanguageContentSchema

const MultiLanguageContentSchema = new Schema({
  value: {
    type: String,
    required: true
  },
  ...
});

, и у меня есть следующий агрегированный запрос mongoose. Цель состоит в том, чтобы выбрать всех сотрудников с прикрепленным к ним дополнительным полем.

    const employees = await Employee.aggregate([
      {
        $match: {
          status: "active",
          $nor: [
            { email: "blablabla" },
            { email: "blobloblo" }
          ]
        }
      },
      {
        $lookup: {
          from: AdditionalField.collection.name,
          let: { af_id: "$_id" },
          pipeline: [{
            $match: {
              $expr: {
                $and: [
                  { $eq: ["$ownership", "$$af_id"] },
                  { $eq: ["$status", "active"] },
                  { $eq: ["$functionalType", "blablabla"] }
                ]
              }
            }
          }],
          as: "afs"
        }
      },
      { $unwind: "$afs" },
      { $unwind: "$afs.names" },
      {
        $group: {
          _id: "$_id",
          email: { $first: "$email" },
          afs: {
            $push: {
              value: "$afs.value",
              names: "$afs.names"
            }
          }
        }
      }
    ]);

Запрос, который я запускаю для проверки этой агрегатной функции.

query TestQuery {
  testQuery
  {
    email
    afs {
      names {
        value
      }
      value
    }
  }
}

Результат, который у меня есть.

"data": {
    "testQuery": [
      {
        "email": "blablabla@test.com"
        "afs": [
          {
            "names": [
              {
                "value": "Name 1"
              }
            ],
            "value": "Value 1"
          },
          {
            "names": [
              {
                "value": "Name 2"
              }
            ],
            "value": "Value 2"
          },
          ...
        ]
      },
      ...

Результат хорош, у меня есть данные, которые я хочу. Но я хотел бы получить такой результат ниже

"data": {
    "testQuery": [
      {
        "email": "blablabla@test.com",
        "afs": [
          {
            "names": "Name 1",
            "value": "Value 1"
          },
          {
            "names": "Name 2",
            "value": "Value 2"
          },
          ...
        ]
      },
      ...

Кажется, { $unwind: "$afs.names" }, не работает. Есть идеи ? Спасибо, Фло

...