在mongodb的聚合查询中将两个基于公共字段的对象数组合并为一个数组

在mongodb的聚合查询中将两个基于公共字段的对象数组合并为一个数组,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有下面的模式 { _id: ObjectId, account: [{ accountId: String, commonId: string } ], sessions: [{ sessionId: String, commonId: String } ] } 我想在聚合查询中将这两个数组合并成一个对象数组,结果应该是 { _id: ObjectId, merged: [{ accountId: String, stringId:

我有下面的模式

{
 _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'
  }
 ],

此版本或此版本的非预期版本


我该怎么做?非常感谢您提供的任何帮助

您可以在下面使用

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

使用
$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
                ]
              }
            ]
          }
        }
      }
    }
  }
])

你能给我看一些样品吗documents@Ashh添加了一个示例文档
帐户
会话
将始终具有相同的大小/顺序?或者我们需要检查
commonId
来合并项目?@Valijon它可能不同,所以我们需要检查commonId来合并项目