0

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

我的 Json 是:

    db.test.findOne();
{
        “_id”:ObjectId(“51e7dd16d2f8db27b56ea282”),
        “广告”:“noc2”,
        “列表” : {
                “p45”:{
                        “id”:“p45”,
                        “日期”:ISODate(“2014-01-01T12:18:30.568Z”),
                        “价值3”:21,
                        “价值1”:100,
                        “价值2”:489
                },
                “p6”:{
                        “id”:“p6”
                        “日期”:ISODate(“2013-07-18T12:18:30.568Z”),
                        “价值3”:21,
                        “价值1”:100,
                        “价值2”:489
                },
                “p4578”:{
                       “身份证”:“4578”
                        “日期”:ISODate(“2013-07-18T12:18:30.568Z”),
                        “价值3”:21,
                        “价值1”:100,
                        “价值2”:489
                }
        }
}

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

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

 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


    }

}

谢谢。

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 回答