0

1回のリクエストで複数のフィールドを更新したいので、mongo dbに大きな問題があります。

私のJsonは:

    デシベル。テスト。findOne();
{
        "_id" : ObjectId("51e7dd16d2f8db27b56ea282"),
        "広告" : "noc2",
        「リスト」:{
                "p45": {
                        "id": "p45",
                        "date" : ISODate("2014-01-01T12:18:30.568Z"),
                        「値3」: 21、
                        「値1」: 100、
                        「値2」: 489
                }、
                "p6": {
                        「ID」:「p6」
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        「値3」: 21、
                        「値1」: 100、
                        「値2」: 489
                }、
                "p4578": {
                       「ID」:「4578」
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        「値3」: 21、
                        「値1」: 100、
                        「値2」: 489
                }
        }
}

createdDate フィールドが存在しないか null の場合、すべての要素 list に対してフィールド createdDate を作成します。

リクエストの例、コード Java で upsert true を使用して 1 つのフィールドを更新するために使用するもの:

 db.people.update({"advertiser":"noc2","list.4578.createdDate":{$exists:false}},{$set:{"list.p4578.createdDate":"08/08/08"}});

list.4578 が変数に置き換えられている Java を試してみましたが、フィールドが多すぎて長すぎます。100 個のフィールドがある場合、100 個のリクエストを実行します。

見て :

public void createdFirstDateField(MongoAccess mongo, String ad,HashMap<String,Object> hfirstDate){



    BasicDBObject searchQuery = new BasicDBObject();


    Iterator <String> it = hfirstDate.keySet().iterator();
    String key="";

    while (it.hasNext()){

    key=it.next();
    searchQuery.append("ad", ad).append(key, new BasicDBObject("$exists", false));

    //System.out.println(key);
    BasicDBObject doc = new BasicDBObject ();
    doc.append("$set",new BasicDBObject(key,new Date()));
    mongo.insert(searchQuery, doc); // update with upsert true


    }

}

ありがとう。

4

2 に答える 2

0

upsert で更新を使用しないのはなぜですか?

db.people.update({"advertiser": "noc2"},
                 {$set: {"list.$.createdDate": "08/08/08"}},
                 {$upsert: true);

が存在する場合はcreatedDate更新され、存在しない場合は挿入されます。

于 2013-07-19T10:52:03.543 に答える
0

update Multi を使用して、一度に複数のドキュメントを更新できます。しかし、複数の埋め込みドキュメントを更新するアトミックな方法はありません。

mongodb 位置演算子をチェックアウトできますが、これはユースケースには適合しません。

于 2013-07-19T12:21:14.690 に答える