7

私はこれと同様のデータ構造を持っています:

var GrandGrandChild = mongoose.Schema({
    attribute: String,
    id: Number
});

var GrandChild = mongoose.Schema({
    children: [GrandGrandChild],
    id: Number,
    irrelevantAttribute: String
});

var Child = mongoose.Schema({
    children: [GrandChild],
    id: Number,
    irrelevantAttribute2: String
});

var Parent = mongoose.Schema({
    children: [Child],
    id: Number,
    irrelevantAttribute3: String
});

var GrandParent = mongoose.Schema({
    children: [Parent],
    id: Number,
    irrelevantAttribute4: String
});

これらは、サブドキュメントを含む多くのコレクションです。ID は兄弟に対して一意ですが、同じスキーマを持つすべての要素に対して一意ではないことに注意してください。

したがって、1 人の祖父母が id 0 の親を持つことができ、別の祖父母も id 0 の親を持つことができます。ただし、1 つの祖父母が id 0 を持つ 2 つの親を持つことはできません。

保存される唯一のスキーマは GrandParent スキーマであり、mongoose/mongodb は、この祖父母のすべてのデータの大きな単一ドキュメントを作成します。(まさに私が探しているもの)

ここに私の問題があります: GrandParent ID、Parent ID、Child ID、GrandChildID、および GrandGrandChild ID があり、これらすべての ID が指している GrandGrandChild オブジェクトのみを取得したいと考えています。

醜い方法ですが、現在私が仕事に取り掛かることができる唯一の方法は、祖父母のこの大きなドキュメントを取得するクエリを作成し、すべての配列を手動でループして正しい親を見つけ、次にもう一度ループして正しい親を見つけることです子、次にもう一度ループして正しい孫を見つけ、次にもう一度ループして、ここで必要な孫孫を見つけます。

私の質問は、孫のドキュメントのみ、または子の属性のみが含まれる祖父母のドキュメントを返すクエリをマングースで作成する方法です。その子の属性には、参照する子オブジェクトを参照する親オブジェクトのみが含まれます。 grandgrandchild オブジェクトを参照する孫オブジェクト。結果として次のことが可能になります。

GRANDPARENT  PARENT      CHILD      GRANDCHILD   GRANDGRANDCHILD
grandparent.children[0].children[0].children[0].children[0].attribute;

私が得た限り、誰かがこのクエリで私を助けてくれることを願っています:

GrandParentModel.findOne(
    {
        "id" : 0,
        "children.id" : 0,
        "children.children.id" : 0,
        "children.children.children.id" : 0,
        "children.children.children.children.id" : 0
    },
    {"children.children.children.children.$" : 1}, callback);

このクエリの問題は、不要な兄弟が削除されないことです。

誰かが私を助けてくれることを願っています。

ヒルク・ブロン

4

3 に答える 3

2

この種のものをきれいに機能させるのは非常に困難です。

このトピックに関する明確な解決策は見つかりませんでしたが、ループについてお手伝いできるかもしれません。var doc = parent.children.id(id); を使用してループを回避できます。サブドキュメントの検索

これがお役に立てば幸いです。よろしく、セバスチャン。

于 2013-06-26T15:38:54.620 に答える