0

これは私のサンプルドキュメントです。

{
    "_id" : ObjectId("51f20148a85e39af87510305"),
    "group_name" : "sai",
    "privileges" : [
        "Notification",
        "News Letter"
    ],
    "users" : [
        {
            "full_name" : "sumit",
            "user_name" : "sumitdesh",
            "password" : "magicmoments",
            "status" : "Active"
        },
        {
            "full_name" : "ad",
            "user_name" : "asd",
            "password" : "asdf",
            "status" : "Active"
        }
    ]
}

ユーザー配列の内部ドキュメントを新しいドキュメントに置き換えたい。

これは私のJavaコードです:

BasicDBObject g1=new BasicDBObject();
g1.put("full_name", "ram");
g1.put("user_name", "ram123");
g1.put("password", "pass$123");
g1.put("status", "Inactive");
BasicDBObject doc=new BasicDBObject();
doc.put("users",g1);
BasicDBObject q=new BasicDBObject("users.user_name","asd");
con.update(q,doc);

どんな助けでも大歓迎です

期待される出力は次のとおりです。内部ドキュメントをこれらの値に置き換えたい

{
        "_id" : ObjectId("51f20148a85e39af87510305"),
        "group_name" : "sai",
        "privileges" : [
            "Notification",
            "News Letter"
        ],
        "users" : [
            {
                "full_name" : "sumit",
                "user_name" : "sumitdesh",
                "password" : "magicmoments",
                "status" : "Active"
            },
            {
                "full_name" : "ram",
                "user_name" : "ram123",
                "password" : "pass$123",
                "status" : "Inactive"
            }
        ]
    }
4

3 に答える 3

1

$setand演算子を組み合わせる必要があり$ます。その後、配列の特定の項目を更新できます。

BasicDBObject g1 = new BasicDBObject();
g1.put("users.$.full_name", "ram");
g1.put("users.$.user_name", "ram123");
g1.put("users.$.password", "pass$123");
g1.put("users.$.status", "Inactive");

BasicDBObject doc = new BasicDBObject();
doc.put("$set", g1);

BasicDBObject q = new BasicDBObject("users.user_name","asd");
con.update(q,doc);
于 2013-07-26T13:33:00.843 に答える
0

コードは、新しいユーザーのみで構成される新しいドキュメントを作成します。既存のドキュメントの配列に新しい要素を追加するには、$push 演算子を使用します

BasicDBObject where = new BasicDBObject("_id", new ObjectId("51f20148a85e39af87510305");
BasicDBObject doc = //... your new user object
BasicDBObject push = new BasicDBObject("$push", doc);
con.update(where, push);

既存のドキュメントのフィールドを変更するには、set-operator と $-placeholder を組み合わせて使用​​できます。これにより、user_name が「foo」から「bar」に変更されます。

BasicDBObject where =  new BasicDBObject("users.user_name", "foo");
BasicDBObject value =  new BasicDBObject("users.$.user_name", "bar");
BasicDBObject set = new BasicDBObject("$set", value);
con.update(where, set);

しかし、データベースからオブジェクトを取得するときに DBObject 全体を維持し、DBObject のすべての変更をミラーリングしてから、

con.save(dbObject);

ORM ラッパー ライブラリは、これを行うことができます。ただし、これは最も簡単な方法ですが、ドキュメント全体がデータベースに送信されるため、最も効率的な方法ではありません。これは、書き込みが頻繁に行われず、ドキュメントが小さい場合は「時期尚早の最適化」の下に簡単に提出できる問題ですが、頻繁に保存して巨大なドキュメントがある場合は、問題になる可能性があります。

于 2013-07-26T13:32:48.853 に答える