4

重複の可能性:
ネストされた配列内のフィールドを更新する MongoDB

次のようなデータがあります。

{ 
    "_id" : ObjectId("4f855061dd53351011000b42"), 
    "act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in" ],  "last_interacted" : "rohan@walkover.in" } } ],
    "email" : "aman@asasas.com", "name" : "Aman",
    "sales" : [{"sno" : 1,  "message" : "description","status" : "open"},{"sno" : 12,"message" : "assad","status" :"open"}]
}

新しいエージェントを追加して、act_mgr:sales の last_interacted を更新したい

"act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in","abc@walkover.in" ],
 "last_interacted" : "abc@walkover.in" } } ]

また、開発者のような新しいact_mgrを追加すると、次のようになります

 "act_mgr" : [{ "sales" : {"agent" : ["rohan@walkover.in","abc@walkover.in" ],  "last_interacted" : "abc@walkover.in" } },
 { "developer" : {"agent" : ["newdeveloper@walkover.in" ],  "last_interacted" : "newdeveloper@walkover.in" } } ]

これらのフィールドを追加する方法がわかりません

4

1 に答える 1

6

次の update ステートメントを使用して、「act_mgr」配列内に埋め込まれた「sales」ドキュメントを更新できます。

> db.sales.update({"act_mgr.sales.last_interacted":"rohan@walkover.in"}, {$push:{"act_mgr.$.sales.agent":"abc@walkover.in"}, $set:{"act_mgr.$.sales.last_interacted":"abc@walkover.in"}})
> db.sales.find().pretty()
{
    "_id" : ObjectId("4f855061dd53351011000b42"),
    "act_mgr" : [
        {
            "sales" : {
                "agent" : [
                    "rohan@walkover.in",
                    "abc@walkover.in"
                ],
                "last_interacted" : "abc@walkover.in"
            }
        }
    ],
    "email" : "aman@asasas.com",
    "name" : "Aman",
    "sales" : [
        {
            "sno" : 1,
            "message" : "description",
            "status" : "open"
        },
        {
            "sno" : 12,
            "message" : "assad",
            "status" : "open"
        }
    ]
}
> 

次のように、「開発者」情報を含む埋め込みドキュメントを配列に追加できます。

> db.sales.update({"_id" : ObjectId("4f855061dd53351011000b42")}, {$push:{"act_mgr":{ "developer" : {"agent" : ["newdeveloper@walkover.in" ],  "last_interacted" : "newdeveloper@walkover.in" } }}})
> db.sales.find().pretty()
{
    "_id" : ObjectId("4f855061dd53351011000b42"),
    "act_mgr" : [
        {
            "sales" : {
                "agent" : [
                    "rohan@walkover.in",
                    "abc@walkover.in"
                ],
                "last_interacted" : "abc@walkover.in"
            }
        },
        {
            "developer" : {
                "agent" : [
                    "newdeveloper@walkover.in"
                ],
                "last_interacted" : "newdeveloper@walkover.in"
            }
        }
    ],
    "email" : "aman@asasas.com",
    "name" : "Aman",
    "sales" : [
        {
            "sno" : 1,
            "message" : "description",
            "status" : "open"
        },
        {
            "sno" : 12,
            "message" : "assad",
            "status" : "open"
        }
    ]
}
> 

$push および $set 修飾子に関するドキュメントは、「更新」ドキュメントにあります: http://www.mongodb.org/display/DOCS/Updating

Mongo db を使用した埋め込みドキュメントの作成と更新の詳細については、「ドット記法 (オブジェクトへの到達)」というタイトルのドキュメントを 参照してください http://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects %29

「$」位置演算子を使用した埋め込みドキュメントの更新に関する情報は、「更新」ドキュメントの「$ 位置演算子」セクションにあります。
http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator

注意点: 一般的に、個々の埋め込みドキュメントをより簡単に参照できるように、すべての埋め込みドキュメントを同じ構造に一致させる方が一般的です。あなたの「販売」配列はこれの良い例です。各埋め込みドキュメントには、同じキー「sno」、「message」、および「status」が含まれています。

ただし、「act_mgr」配列内の埋め込みドキュメントには異なるキーが含まれています。1 番目には「sales」が含まれ、2 番目には「developer」が含まれます。代わりに、次の構造を検討してください。

"act_mgr" : [
    {
        "title" : "sales",
        "agent" : [
            "rohan@walkover.in",
            "abc@walkover.in"
        ],
        "last_interacted" : "abc@walkover.in"
    },
    {
        "title": "developer",
        "agent" : [
            "newdeveloper@walkover.in"
        ],
        "last_interacted" : "newdeveloper@walkover.in"
    }
]

現在、埋め込まれた各ドキュメントには、同じキー "title"、"agent"、および "last_interacted" が含まれています。

次のコマンドでサブドキュメントを更新できます。

> db.sales.update({"act_mgr.title":"sales"}, {$push:{"act_mgr.$.agent":"abc@walkover.in"}, $set:{"act_mgr.$.last_interacted":"abc@walkover.in"}})

うまくいけば、これにより必要な更新を行うことができ、スキーマ設計について考える材料が得られるかもしれません。幸運を!

于 2012-04-12T20:51:55.003 に答える