本篇博文为mongodb的curd中一篇,前面介绍简单的查询使用,这一篇重点则放在插入数据;java
首先是准备好基本环境,能够参考博文mysql
MongoDB一个基本数据称为document,和mysql不同,没有强制约束哪些字段,能够随意的插入,下面是一个简单的插入演示git
private static final String COLLECTION_NAME = "demo";
@Autowired
private MongoTemplate mongoTemplate;
/** * 新增一条记录 */
public void insert() {
JSONObject object = new JSONObject();
object.put("name", "一灰灰blog");
object.put("desc", "欢迎关注一灰灰Blog");
object.put("age", 28);
// 插入一条document
mongoTemplate.insert(object, COLLECTION_NAME);
JSONObject ans = mongoTemplate
.findOne(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(28)), JSONObject.class,
COLLECTION_NAME);
System.out.println(ans);
}
复制代码
使用的关键地方为一行: mongoTemplate.insert(object, COLLECTION_NAME);
github
执行后输出结果为以下spring
{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"欢迎关注一灰灰Blog"}
复制代码
一次插入多条记录,传集合进去便可sql
/** * 批量插入 */
public void insertMany() {
List<Map<String, Object>> records = new ArrayList<>();
for (int i = 0; i < 3; i++) {
Map<String, Object> record = new HashMap<>(4);
record.put("wechart", "一灰灰blog");
record.put("blog", Arrays.asList("http://spring.hhui.top", "http://blog.hhui.top"));
record.put("nums", 210);
record.put("t_id", i);
records.add(record);
}
// 批量插入文档
mongoTemplate.insert(records, COLLECTION_NAME);
// 查询插入的内容
List<Map> result =
mongoTemplate.find(new Query(Criteria.where("wechart").is("一灰灰blog")), Map.class, COLLECTION_NAME);
System.out.println("Query Insert Records: " + result);
}
复制代码
返回结果以下:mongodb
Query Insert Records: [{t_id=0, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5022, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=1, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5023, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}, {t_id=2, wechart=一灰灰blog, _id=5c49b07cd5b7ee435cbe5024, blog=[http://spring.hhui.top, http://blog.hhui.top], nums=210}]
复制代码
咱们但愿在插入以前,判断数据是否存在,若是不存在则插入;若是存在则更新;此时就能够采用upsert来使用,通常三个参数数组
mongoTemplate.upsert(Query query, Update update, String collectionName)
复制代码
第一个为查询条件,第二个为须要更新的字段,最后一个指定对应的collection,一个简单的实例以下spring-boot
/** * 数据不存在,经过 upsert 新插入一条数据 * * set 表示修改key对应的value * addToSet 表示在数组中新增一条 */
public void upsertNoMatch() {
// addToSet 表示将数据塞入document的一个数组成员中
UpdateResult upResult = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)),
new Update().set("age", 120).addToSet("add", "额外增长"), COLLECTION_NAME);
System.out.println("nomatch upsert return: " + upResult);
List<JSONObject> re = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after upsert return should not be null: " + re);
System.out.println("------------------------------------------");
}
复制代码
输出结果以下:学习
nomatch upsert return: AcknowledgedUpdateResult{matchedCount=0, modifiedCount=0, upsertedId=BsonObjectId{value=5c49b07ce6652f7e1add1ea2}}
after upsert return should not be null: [{"add":["额外增长"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120}]
------------------------------------------
复制代码
前面的demo是演示不存在,那么存在数据呢?
/** * 只有一条数据匹配,upsert 即表示更新 */
public void upsertOneMatch() {
// 数据存在,使用更新
UpdateResult result = mongoTemplate.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)),
new Update().set("age", 100), COLLECTION_NAME);
System.out.println("one match upsert return: " + result);
List<JSONObject> ans = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(100)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after update return should be one: " + ans);
System.out.println("------------------------------------------");
}
复制代码
输出结果以下,注意下面的输出数据的 _id
,正视前面插入的那条数据,两个数据惟一的不一样,就是age被修改了
one match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after update return should be null: [{"add":["额外增长"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]
复制代码
若是query条件命中多条数据,怎么办?会修改几条数据呢?
/** * 两条数据匹配时,upsert 将只会更新一条数据 */
public void upsertTwoMatch() {
// 多条数据知足条件时,只会修改一条数据
System.out.println("------------------------------------------");
List<JSONObject> re = mongoTemplate
.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
JSONObject.class, COLLECTION_NAME);
System.out.println("original record: " + re);
UpdateResult result = mongoTemplate
.upsert(new Query(Criteria.where("name").is("一灰灰blog").and("age").in(Arrays.asList(28, 100))),
new Update().set("age", 120), COLLECTION_NAME);
System.out.println("two match upsert return: " + result);
re = mongoTemplate.find(new Query(Criteria.where("name").is("一灰灰blog").and("age").is(120)), JSONObject.class,
COLLECTION_NAME);
System.out.println("after upsert return size should be 1: " + re);
System.out.println("------------------------------------------");
}
复制代码
根据实际输出进行查看,发现只有一条数据被修改;另一条保持不变,结果以下
------------------------------------------
original record: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":28,"desc":"欢迎关注一灰灰Blog"}, {"add":["额外增长"],"name":"一灰灰blog","_id":{"counter":14491298,"date":1548333180000,"machineIdentifier":15099183,"processIdentifier":32282,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":100}]
two match upsert return: AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}
after upsert return size should be 1: [{"name":"一灰灰blog","_id":{"counter":12472353,"date":1548333180000,"machineIdentifier":14006254,"processIdentifier":17244,"time":1548333180000,"timeSecond":1548333180,"timestamp":1548333180},"age":120,"desc":"欢迎关注一灰灰Blog"}]
------------------------------------------
复制代码
相关博文
一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛
尽信书则不如,以上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
一灰灰blog
知识星球