同じドキュメント内の2つの異なるフィールドを一致させようとしています。しかし、期待どおりの出力が得られませんでした。例を挙げて説明します。
同じドキュメントで一致させたいのですが、一致weighted.phaseId
しphases._id
ないものはphases
フィールドから削除する必要があります。
誰かアイデアがありますか?
//データベースに対する集計クエリを処理した後に文書化します。
{
"_id" : ObjectId("5a680c803096130f93d11c7a"),
"weighted" : [
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),
"_id" : ObjectId("5a680c803096130f93d11c7b")
},
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),
"_id" : ObjectId("5a680c803096130f93d11c7c")
}
],
"phases" : [
{
"phase_name" : "Phase 1",
"_id" : ObjectId("5a6734c32414e15d0c2920f0")
},
{
"phase_name" : "Phase 2",
"_id" : ObjectId("5a6734c32414e15d0c2920ef")
},
{
"phase_name" : "Phase 3",
"_id" : ObjectId("5a6734c32414e15d0c2920ee")
},
{
"phase_name" : "Phase 4",
"_id" : ObjectId("5a6734c32414e15d0c2920ed")
}
]
}
//期待される出力
{
"_id" : ObjectId("5a680c803096130f93d11c7a"),
"weighted" : [
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920f0"),
"_id" : ObjectId("5a680c803096130f93d11c7b")
},
{
"phaseId" : ObjectId("5a6734c32414e15d0c2920ee"),
"_id" : ObjectId("5a680c803096130f93d11c7c")
}
],
"phases" : [
{
"phase_name" : "Phase 1",
"_id" : ObjectId("5a6734c32414e15d0c2920f0")
},
{
"phase_name" : "Phase 3",
"_id" : ObjectId("5a6734c32414e15d0c2920ee")
}
]
}
次の集計を使用できます。
db.col.aggregate([
{
$addFields: {
weightedIds: {
$map:
{
input: "$weighted",
as: "w",
in: "$$w.phaseId"
}
}
}
},
{
$project: {
_id: 1,
weighted: 1,
phases: {
$filter: {
input: "$phases",
as: "phase",
cond: { $gte: [ { $indexOfArray: [ "$weightedIds" , "$$phase._id" ] }, 0 ] }
}
}
}
}
])
のフィールド$map
のみを取得するために使用しており、対応するフェーズが存在するかどうかをチェックする$ filterを使用してフィルターで除外できます(それ以外の場合は-1を返す$ indexOfArrayを使用)phaseId
weighted
phases
id
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加