MongoDB集約パイプライン内にプロジェクトを作成しようとしているサンプル文書があります。私は、おおよそ次のようになり、単一の文書でテストしています:文書の各配列要素に式を適用する
{
"_id" : "",
"title" : "Questions",
"sortIndex" : 0,
"topics" : [
{
"_id" : "",
"title" : "Creating a Question",
"sortIndex" : 1,
"thumbnail" : "CreatingAQuestion.jpg",
"seenBy" : [ "user101", "user202" ],
"pages" : [
{
"visual" : "SelectPlanets.gif",
"text" : "Some Markdown"
}
]
},
{
"_id" : "",
"title" : "Deleting a Question",
"sortIndex" : 0,
"thumbnail" : "DeletingAQuestion.jpg",
"seenBy" : [ "user101" ],
"pages" : [
{
"visual" : "SelectCard.gif",
"text" : "Some Markdown"
}
]
}
]
}
私が取得しようとしている出力は、これらの線に沿って何かである:
{
"_id" : "",
"title" : "Questions",
"topics" : [
{
"title" : "Creating a Question",
"thumbnail" : "CreatingAQuestion.jpg",
"seen" : true
},
{
"title" : "Deleting a Question",
"thumbnail" : "DeletingAQuestion.jpg",
"seen" : false
}
]
}
私は苦労しています。具体的ビットseen
フラグです。
私が読んだdocsた状態:
投または埋め込まれた文書内のフィールドをリセット/追加...
...それともネストできるフィールド:
contact: { address: { country: <1 or 0 or expression> } }
私は表現を使いたいと私は次のことに注意しました:
フィールドをネストするとき、埋め込みドキュメント内のドット表記を使用してフィールドを指定することはできません。連絡先:
{ "address.country": <1 or 0 or expression> }
は無効です。
私はどのように式内のサブドキュメントフィールドを参照するかを考えています。引用符ではのドット表記を使用することはできませんが、私はネストされた表記でも動作しないようです。ここで私はこれまで持っているものだ:
db
.getCollection('chapters')
.aggregate([
{
$project: {
title: 1,
topics: {
title: 1,
thumbnail: 1,
publishedAt: 1,
test: "$seenBy",
seen: { $in: ["user202", "$seenBy"] },
}
}
}
])
をだから私はハード今の私のクエリへuser202
をコード化され、そして2つのドキュメントを真と偽を見ると期待しました。私はまた、test
フィールドにサブ文書からseenBy
フィールドをマッピングしました。これが何を生産することである:
{
"_id" : "",
"title" : "Questions",
"topics" : [
{
"title" : "Creating a Question",
"thumbnail" : "CreatingAQuestion.jpg",
"test" : [
"user101",
"user202"
],
"seen" : true
},
{
"title" : "Deleting a Question",
"thumbnail" : "DeletingAQuestion.jpg",
"test" : [
"user101",
"user202"
],
"seen" : true
}
]
}
だから、明らかに私の
test
フィールドが第一文書からのデータが含まれているため、「$ seenBy」正しいトピックにアクセスしていません。
最終的に私の質問は、どのようにサブ文書内のseenBy
フィールドにアクセスできますか?現在のサブ文書を参照して、式を作成できますか?
注:これは複数の$project
と$unwind
で動作しますが、少し圧縮してみてみたかったです。
以前は '$ map'を使用していなかったことにとても感謝していますが、あなたがそれについて考えるときには使い方に合っていると完全に理解しています。私は、私が望むことができるはずのように聞こえてきたので、ドキュメントが間違った道を導いたと思う。 – Ian