更新值 $set
update.set("title", title);
加法/减法
//相当于number=number+1
update.inc("number", 1);
//相当于number=number-1
update.inc("number", -1);
乘法
//相当于sum=sum*100
update.multiply("sum", 100)
没有key插入,有不做操作
$setOnInsert
update.setOnInsert("createDate", currentDate);
如果update的更新参数upsert:true
,也就是如果要更新的文档不存在的话会插入一条新的记录,$setOnInsert
操作符会将指定的值赋值给指定的字段,如果要更新的文档存在那么$setOnInsert
操作符不做任何处理
时间更新
update.currentDate("updateDate");
$currentDate
操作符是只用在更新操作上,不可以用在insert
操作,更新日期类型的字段时建议使用$currentDate
操作符,因为它是直接取的数据库服务端的时间,而使用new Date()
设置日期取的是当前服务器上的时间,容易造成误差
示例
Query query = new Query();
query.addCriteria(where("keyword").is(keyword).and("app_no").is(Constant.APP_NO));
Update update = new Update();
update.inc("number", 1);
update.currentDate("updateDate");
update.setOnInsert("createDate", new Date());
mongoTemplate.findAndModify(query, update, FindAndModifyOptions.options().upsert(true), SearchKeyword.class);
内嵌数组操作
$push
添加指定数据到数组中
update.push("process", process);
update.push("lawPeopleMedias").each(lawPeopleMedias);
$pushAll
添加指定多个数据到数组中
同 $push
文档中数组操作-增删改
// 操作类型:默认0-全局数组保存、1-原数组中追加后面数组multiMediaList、2-数组中删除所传multiMediaList、3-根据name修改
int handleType = Integer.parseInt(oBody.getOrDefault("handleType", "0").toString());
String shopId = oBody.getString("shopId"); // 店铺id
JSONArray array = oBody.getJSONArray("cameraList");
List<MultiMedia> cameraArray = GsonUtil.jsonToList(array.toString(), MultiMedia.class);
Criteria criteria = Criteria.where("_id").is(new ObjectId(shopId)).and("uid").is(new ObjectId(user.getId()));
Update update = new Update();
if (handleType == 1) {
update.push("camera", cameraArray.get(0));
} else if (handleType == 2) {
update.pull("camera", cameraArray.get(0));
} else if (handleType == 3) {
criteria.and("camera.content").is(cameraArray.get(0).getContent());
update.set("camera.$.name", cameraArray.get(0).getName());
update.set("camera.$.cover", cameraArray.get(0).getCover());
} else {
update.set("camera", cameraArray);
}
UpdateResult updateResult = mongoTemplate.updateFirst(new Query(criteria), update, Shop.COLLECTION_NAME);
Assert.isTrue(updateResult.getMatchedCount() > 0, "您无权限修改该店铺!");
注意:同一文档中的数据无法批量