Как объединить два поля в одно поле в MongoDB - PullRequest
2 голосов
/ 03 мая 2020

Ниже приведены примеры документов по сбору продуктов:

{ _id:'xxxxxxxxxxxx',
  name:'product 1'
 }
{ _id:'xxxxxxxxxxxx',
  name:'product 2'
 }

как сгруппировать значение поля id в значение поля name в mongodb?

Ожидаемый результат:

[{'xxxxxxxxxxxx:'product1'},{'xxxxxxxxxxxx':'product2'}]

1 Ответ

2 голосов
/ 03 мая 2020

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

В версии MongoDB> = 4.2:

db.collection.aggregate([
  {
    $replaceWith: {
      $arrayToObject: [
        [
          {
            k: { $toString: "$_id" },
            v: "$name"
          }
        ]
      ]
    }
  }
])

Тест: mongoplayground

В версии MongoDB> = 4.0:

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [
          [
            {
              k: { $toString: "$_id" },
              v: "$name"
            }
          ]
        ]
      }
    }
  }
])

Тест: mongoplayground

На всякий случай, если вы ' Еще больше полей и хотите сохранить все из них в документе в конечном результате, затем попробуйте это на MongoDB версии> = 4.0:

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          {
            $arrayToObject: [ [ { k: { $toString: "$_id" }, v: "$name" } ] ]
          },
          "$$ROOT"
        ]
      }
    }
  }
])

Test: mongoplayground

Примечание: Поскольку ключи в объекте должны иметь тип string и не могут содержать тип ObjectId() Мы преобразуем значение _id в string , если ваш _id имеет тип string, то нет необходимости использовать оператор $toString.

Ref: агрегация-конвейер-этапы

...