在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来合并项目