2

ネストされたドキュメントを ID またはその他のフィールドで更新する方法はありますか?

「単一ドキュメント内の完全なツリー」を使用していますが、ネスティングがどの程度深くなるかを事前に知りません。更新する必要があります。たとえば、{id:'104'} で回答してください。「ドット表記」を使用してそれを行うことができますが、ネストのレベル (深さ) がわからないため、どれくらい長くできるかを予測できません'comment.answers.answers....answers.'

id:'104' を直接見つけて更新する方法はありますか、それとも何らかの深度マークを渡す必要がありますか?

{
 title:'some title',
 comment:
     {
        id:'101'
        author:'Joe',
        text:'some comment',
        answers:
        [
            {
              id:'102'
              author:'Joe',
              text:'first answer to comment',
              answers:
                    [
                       {
                           id:'103'
                           author:'Done',
                           text:'first answer to first answer to comment',
                           answers:[]
                       },
                       {
                           id:'104'
                           author:'Bob',
                           text:'Second answer to first answer to comment',
                           answers:[]
                       }

                    ]

            },

            {
            },

            {
            },
        ]
     }
}

Node.JS MongoDB ドライバーを使用しています

4

2 に答える 2

1

各ノードの深さレベルを保存してから、動的にクエリを作成する必要があると思います。

于 2012-07-02T04:41:35.897 に答える
1

要するに、この種のクエリを実行するための本当に良い方法はありません。いくつかのオプションがあります:

$orドキュメントの可能なネストされた場所のそれぞれを指定して、長いステートメントでクエリを作成できます。

{ comment.id: 103, $or [
                        { comment.answers.id: 103 }, 
                        { comment.answers.answers.id: 103 },
                        { comment.answers.answers.answers.id: 103 } 
                       ] 
}

$or 演算子の詳細については、 docs を参照してください

実際には、より適切で持続可能な解決策は、すべてのコメントと回答がフラット配列に格納され、comments.parentフィールド内のコメント間の関係に関する情報を格納する別のスキーマを使用することです。例えば:

 { comment: [
           { id: 1 }
           { id: 2, parent: 1 }
          ] }

追加のオプションと、コメント階層をモデル化する方法の詳細については、MongoDB ドキュメントのコメントの保存のユース ケースを参照してください。

また、MongoDB のツリーには、考慮したい戦略がいくつかあります。

于 2012-07-02T15:01:00.350 に答える