3

以下に示すように、MongoDB には Document1 があります。「main.accounts」(およびその後は「main.entries」) ドキュメントに到達し、「content」配列内のサブドキュメント全体を更新 ($set) したいと考えています。これまでのところ、サブドキュメントを書き込みます。 「コンテンツ」サブ配列に対してドキュメントを追加および削除できましたが、この場合、一致したドキュメントの 1 つのプロパティを更新 ($set) するだけでなく、ドキュメント全体を更新したいと考えています。

以下では、$set、$elemMatch を使用した $set のみを使用してみました。また、findAndModify も試しましたが、役に立ちませんでした。もちろん、私は解決策を見つけるために、i) RTFM、ii) インターネット、iii) SO を調べました。この方法でドキュメント全体を更新できた人はいますか?

ありがとうティム

更新試行 1 - これは機能する唯一の更新ですが、"content" 配列全体をハッシュに設定します … { "fu" : "bar" }

    デシベル。簿記。更新(
      {
        所有者: "twashing@gmail.com",
        "content.content.tag": "アカウント",
        "content.content.id": "1"
      }、
      { $set : { "content.$.content" : { "fu" : "bar" } } }
    )

Update try 2 - これは失敗しませんが、問題のドキュメントは更新されません

    デシベル。簿記。更新(
      {
        所有者 : "fu",
        thing : { $elemMatch : { "content.content.tag" : "アカウント", "content.content.id" : "1つ" } }
      }、
      { $set : { "モノ" : { "フー" : "バー" } } }
    )

Update try 3 - これは失敗しませんが、問題のドキュメントは更新されません

    デシベル。簿記。更新(
      { もの : { $elemMatch : { 所有者 : "fu" , "content.content.tag" : "アカウント", "content.content.id" : "1 つ" } } },
      { $set : { "thing.content.content.$" : { "fu" : "バー" } } }
    )

ドキュメント1

    {
            "_id": "fid",
            "コンテンツ" : [
                    {
                            "コンテンツ" : [
                                    {
                                            "やりました"、
                                            「タグ」:「アカウント」
                                    }、
                                    {
                                            "id" : "2",
                                            「タグ」:「アカウント」
                                    }、
                                    {
                                            "id": "3",
                                            「タグ」:「アカウント」
                                    }、
                                    {
                                            "id" : "4",
                                            「タグ」:「アカウント」
                                    }、
                                    {
                                            "id": "5",
                                            「タグ」:「アカウント」
                                    }

                            ]、
                            "id" : "main.accounts",
                            「タグ」:「アカウント」
                    }、
                    {
                            "タグ" : "ジャーナル",
                            "id" : "main.journals",
                            "コンテンツ" : [
                                    {
                                            "タグ" : "ジャーナル",
                                            "id" : "総勘定元帳",
                                            "名前" : "総勘定元帳",
                                            "タイプ" : ""、
                                            "残高" : ""、
                                            "コンテンツ" : [
                                                    {
                                                            "タグ" : "エントリ",
                                                            "id": "main.entries",
                                                            "コンテンツ" : [ ]
                                                    }
                                            ]
                                    }
                            ]
                    }
            ]、
            "所有者" : "ふ",
            "タグ" : "フバー"
    }

4

2 に答える 2

1

配列の第 2 レベルを更新するために位置演算子を使用することはできません$(配列内の配列)。

このリンクはあなたを助けるかもしれません

于 2012-06-15T06:57:18.503 に答える
-1

構造内で複数の配列を使用し、サブドキュメント (content[documents]) (main.accounts および main.entries) をこれは同じルート ドキュメントを返しますが、その戻り値では、コンテンツ配列のどの位置が基準であったかを知ることができません。そのため、新しい値を正しい位置に挿入することはできません。

可能であれば、ドキュメントを再構成して、入れ子になった配列 (コンテンツ->コンテンツ->コンテンツ->コンテンツ) を避けることをお勧めします。特に、それらのサブセットで更新を行う予定がある場合はなおさらです。結局のところ、これは NoSQL であるため、設計に冗長なデータを含めることは問題ありません。これにより、作業が楽になり、コードがよりクリーンになります。

于 2012-06-16T12:51:18.423 に答える