更新Mongodb的多个字段

时间:2013-07-19 10:19:33

标签: java json mongodb request updates

我对mongo db有一个很大的问题,因为我想用一个请求更新多个字段。

我的Json是:


    db.test.findOne();
{
        "_id" : ObjectId("51e7dd16d2f8db27b56ea282"),
        "ad" : "noc2",
        "list" : {
                "p45" : {
                        "id" : "p45",
                        "date" : ISODate("2014-01-01T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                },
                "p6" : {
                        "id" : "p6"
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                },
                "p4578" : {
                       "id" : "4578"
                        "date" : ISODate("2013-07-18T12:18:30.568Z"),
                        "value3" : 21,
                        "value1" : 100,
                        "value2" : 489
                }
        }
}

如果createdDate字段不存在或为null,我想为所有元素列表创建一个字段createdDate。

一个请求示例,我用于在我的代码java中使用upsert true更新一个字段:

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

我尝试使用java,其中list.4578被变量替换,但是对于太多字段来说太长了。如果我有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


    }

}

感谢。

2 个答案:

答案 0 :(得分:0)

为什么不使用update with upsert

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

如果createdDate存在,它将被更新,否则将被插入。

答案 1 :(得分:0)

您可以一次更新多个文档using update Multi。但是,没有原子方式来更新多个嵌入式文档。

您可以签出mongodb位置运算符,但这不适合您的用例。