Конкат подгруппы агрегации mongodb - PullRequest
1 голос
/ 07 апреля 2020

Предположим, у меня есть следующий документ:

   {
      "_id": "101",
      "animalArray": [['dog'], ['lizard', 'lion']],
      "array_b":[10,20]
   }

Какой простой способ объединить ['lizard', 'lion'] и [10,20] для получения этого вывода:

{
    "_id": "101",
    "animalArray": [['dog'], ['lizard', 'lion', 10, 20]]
}

array_b необходимо объединить только со вторым подмассивом. Используя $concatArrays и $project, я не смог получить этот результат.

Ответы [ 2 ]

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

Если у вас есть более 2 элементов в animalArray, то ответ whoami, вероятно, лучший. Но если у вас есть только 2 элемента, вы можете сделать это за один этап $ project с помощью $ concatArrays. Вот запрос:

db.collection.aggregate([
  {
    $project: {
      "animalArray": {
        $concatArrays: [
          [
            {
              $arrayElemAt: [
                "$animalArray",
                0
              ]
            }
          ],
          [
            {
              $concatArrays: [
                {
                  $arrayElemAt: [
                    "$animalArray",
                    1
                  ]
                },
                "$array_b"
              ]
            }
          ],

        ]
      }
    }
  }
])

Вы можете проверить это здесь

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

Вы можете попробовать выполнить запрос агрегации ниже:

Запрос 1:

db.collection.aggregate([
  {
    $project: {
      animalArray: {
        $map: {
          input: "$animalArray",
          in: {
            $cond: [ /** Check if it's first element in 'animalArray' array */
              { $eq: ["$$this", { $arrayElemAt: ["$animalArray", 1] }] },
              { /** If Yes, merge 1st element with elements of 'array_b' array */
                $reduce: {
                  input: "$array_b",
                  initialValue: "$$this",
                  in: { $concatArrays: ["$$value", ["$$this"]] }
                },
              },
              "$$this" /** If No, Just pass it on*/
            ],
          },
        },
      },
    },
  }
]);

Тест: MongoDB-Playground

Запрос 2: Возможно, вам не понадобится использовать $map до l oop через 'animalArray', если он содержит только два элемента, поскольку первый запрос делает это динамически.

db.collection.aggregate([
  {
    $project: {
      animalArray: 1,
      mergedArray: {
        $reduce: {
          input: "$array_b",
          initialValue: { $arrayElemAt: ["$animalArray", 1] },
          in: { $concatArrays: ["$$value", ["$$this"]] },
        },
      },
    },
  },
  {
    $project: {
      animalArray: {
        $concatArrays: [
          [{ $arrayElemAt: ["$animalArray", 0] }],
          ["$mergedArray"],
        ],
      },
    },
  },
]);

Тест: MongoDB-Playground

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