embeddedManyという埋め込みドキュメントの配列を持つContainerという名前のコレクションがあります。埋め込まれた各ドキュメントは、Referencedという名前の他のいくつかのドキュメントを参照しています。これらの参照は、referenceManyという配列に格納されています。ドキュメントは次のようになります。ネストされた参照配列内の一致するサブドキュメント要素のみを返します
{
"_id" : ObjectId("5a312337ea5cb32d30005d25"),
"embeddedMany" : [
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb"),
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
}
],
}
ここで特定のドキュメントを参照するすべての埋め込みドキュメントを見つける必要があります。これを言ってみましょう:DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
。
私はこのようにして、結果の文書を必要とする:
{
"_id" : ObjectId("5a312337ea5cb32d30005d25"),
"embeddedMany" : [
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d23"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
},
{
"referencedMany" : [
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d24"), "myDb")
DBRef("Referenced", ObjectId("5a312337ea5cb32d30005d22"), "myDb")
]
}
],
}
私はthis非常に同様の問題をお読みください。だから、私は集約を使用し、埋め込まれたフィールドをフィルタリングする必要があると思います。私の集計はこれまでのようになります:
db.Container.aggregate(
[
{
$match: {
"embeddedMany.referencedMany.$id": ObjectId("5a312337ea5cb32d30005d22")
}
},
{
$project: {
"embeddedMany": {
"$filter": {
"input": "$embeddedMany",
"as": "embedded",
"cond": {
"$eq": [
"$$embedded.referencedMany.$id",
ObjectId("5a312337ea5cb32d30005d22")
]
}
}
}
}
},
]
);
これは私が壁に当たった場所です。 MongoDBにはoutstanding bugがあり、の$eq
表現を比較することができません。 $objectToArray
をハックとして使用することに関するいくつかの言及がありますが、私はそれを一から取り除くことができませんでした。
ご協力いただければ幸いです。
OMG、これは複雑で手伝ってくれてありがとうので、非常に多く、私はそれを理解することができます前に、それを詳細に調べる必要があります –
。。。私の謝罪。私は不必要に複雑にしました。 – Veeram