Объединить два массива объектов на основе общего поля в один массив в запросе агрегации в mongodb - PullRequest
2 голосов
/ 29 апреля 2020

У меня есть схема ниже

{
 _id: ObjectId,
 account: [{
   accountId: String,
   commonId: string
  }
 ],
 sessions: [{
   sessionId: String,
   commonId: String
  }
 ]
}

Я хочу объединить оба этих массива в один массив объектов в совокупном запросе, где результат должен быть

{
 _id: ObjectId,
 merged: [{
   accountId: String,
   stringId: String,
   commonId: string
  }
 ],
}

Образец документа:

{
  _id: 0,
  account: [
  { 
    accountId: '1234',
    commonId: '0'
  },
  {
    accountId: '1235',
    commonId: '1'
  },
  {
    accountId: '1236',
    commonId: '2'
  }
 ],
 sessions: [
  {
   sessionId: '6781',
   commonId:'0'
  },
  {
   sessionId: '6782',
   commonId:'1'
  },
  {
   sessionId: '6783',
   commonId:'2'
  } 
 ]

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

{
  _id: 0,
  merged: [
  { 
    accountId: '1234',
    sessionId: '6781',
    commonId: '0'
  },
  {
    accountId: '1235',
    sessionId: '6782',
    commonId: '1'
  },
  {
    accountId: '1236',
    sessionId: '6783',
    commonId: '2'
  }
 ],

эта или неопубликованная версия этого

Как я могу это сделать? Любая помощь приветствуется

Ответы [ 2 ]

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

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

db.collection.aggregate([
  {
    $project: {
      merged: {
        $map: {
          input: "$account",
          as: "acc",
          in: {
            $mergeObjects: [
              "$$acc",
              {
                $arrayElemAt: [
                  {
                    $filter: {
                      input: "$sessions",
                      as: "ses",
                      cond: {
                        $eq: [
                          "$$ses.commonId",
                          "$$acc.commonId"
                        ]
                      }
                    }
                  },
                  0
                ]
              }
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

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

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

db.collection.aggregate([
  { "$project": {
    "merged": {
      "$map": {
        "input": "$account",
        "in": {
          "accountId": "$$this.accountId",
          "commonId": "$$this.commonId",
          "sessionId": {
            "$arrayElemAt": [
              "$sessions.sessionId",
              {
                "$indexOfArray": ["$sessions.commonId", "$$this.commonId"]
              }
            ]
          }
        }
      }
    }
  }}
])

MongoPlayground

...