MongoDB 添加到从基础 1 开始的加入集合字段
MongoDB add to joining collection field from base one
我有两个合集:
具有架构的游戏:
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
},
]
架构问题:
_id: ObjectId('baz'),
text: 'FooBar'
现在我想将问题加入到游戏中,并添加到每个问题记录值 question_position
。
所以,我有这样的查询:
db.games.aggregate([
{
$lookup: {
from: 'questions',
localField: 'questions.question_id',
foreignField: '_id',
as: 'question_data',
},
}])
其中 return 我所有需要的信息,根据问题数组正确加入,
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
}
],
question_data: [
{
_id: ObjectId('baz'),
text: 'FooBar',
},
{
_id: ObjectId('ban'),
text: 'FooBar2',
}
]
但我完全不知道如何根据游戏将其位置添加到连接问题中。
看起来像这样:
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
}
],
question_data: [
{
_id: ObjectId('baz'),
text: 'FooBar',
position: 1,
},
{
_id: ObjectId('ban'),
text: 'FooBar2',
position: 2,
}
]
我已经尝试在游戏合集中使用 $unwind
作为问题数组,在 aggregation
中使用 $project
玩了一点但仍然没有结果。
所以,我的问题是,如何将基础集合中的字段添加到另一个集合中的连接数据
您需要先$unwind
the questions
array and then need to apply $lookup
and finally use $group
回滚到数组中。
db.games.aggregate([
{ "$unwind": "$questions" },
{ "$lookup": {
"from": "questions",
"localField": "questions.question_id",
"foreignField": "_id",
"as": "question_data"
}},
{ "$unwind": "$question_data" },
{ "$addFields": {
"question_data.position": "$questions.position",
"question_data.question_id": "$questions.question_id"
}},
{ "$group": {
"_id": "$_id",
"questions": { "$push": "$questions" },
"question_data": { "$push": "$question_data" }
}}
])
我有两个合集:
具有架构的游戏:
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
},
]
架构问题:
_id: ObjectId('baz'),
text: 'FooBar'
现在我想将问题加入到游戏中,并添加到每个问题记录值 question_position
。
所以,我有这样的查询:
db.games.aggregate([
{
$lookup: {
from: 'questions',
localField: 'questions.question_id',
foreignField: '_id',
as: 'question_data',
},
}])
其中 return 我所有需要的信息,根据问题数组正确加入,
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
}
],
question_data: [
{
_id: ObjectId('baz'),
text: 'FooBar',
},
{
_id: ObjectId('ban'),
text: 'FooBar2',
}
]
但我完全不知道如何根据游戏将其位置添加到连接问题中。 看起来像这样:
_id: ObjectId('gameId'),
questions: [
{
position: 1,
question_id: ObjectId('baz')
},
{
position: 2,
question_id: ObjectId('ban')
}
],
question_data: [
{
_id: ObjectId('baz'),
text: 'FooBar',
position: 1,
},
{
_id: ObjectId('ban'),
text: 'FooBar2',
position: 2,
}
]
我已经尝试在游戏合集中使用 $unwind
作为问题数组,在 aggregation
中使用 $project
玩了一点但仍然没有结果。
所以,我的问题是,如何将基础集合中的字段添加到另一个集合中的连接数据
您需要先$unwind
the questions
array and then need to apply $lookup
and finally use $group
回滚到数组中。
db.games.aggregate([
{ "$unwind": "$questions" },
{ "$lookup": {
"from": "questions",
"localField": "questions.question_id",
"foreignField": "_id",
"as": "question_data"
}},
{ "$unwind": "$question_data" },
{ "$addFields": {
"question_data.position": "$questions.position",
"question_data.question_id": "$questions.question_id"
}},
{ "$group": {
"_id": "$_id",
"questions": { "$push": "$questions" },
"question_data": { "$push": "$question_data" }
}}
])