我对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
}
}
感谢。
答案 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位置运算符,但这不适合您的用例。