Spring Data MongoDB : Insert document
In Spring data MongoDB, you can use save()
, insert()
to save a or a list of objects into mongoDB database.
User user = new User("...");
//save user object into "user" collection / table
//class name will be used as collection name
mongoOperation.save(user);
//save user object into "tableA" collection
mongoOperation.save(user,"tableA");
//insert user object into "user" collection
//class name will be used as collection name
mongoOperation.insert(user);
//insert user object into "tableA" collection
mongoOperation.insert(user, "tableA");
//insert a list of user objects
mongoOperation.insert(listofUser);
By default, if you saved an object, and didn’t specified any of the “collection name”, the class name will be used as the collection name.
1. Save and Insert
Should you use the Save or Insert?
- Save – It should rename to
saveOrUpdate()
, it performsinsert()
if “_id” is NOT exist orupdate()
if “_id” is existed”. - Insert – Only insert, if “_id” is existed, an error is generated.
See example below
//get an existed data, and update it
User userD1 = mongoOperation.findOne(
new Query(Criteria.where("age").is(64)), User.class);
userD1.setName("new name");
userD1.setAge(100);
//if you insert it, 'E11000 duplicate key error index' error is generated.
//mongoOperation.insert(userD1);
//instead you should use save.
mongoOperation.save(userD1);
2. Insert documents example
See a full example to show you how to save a or a list of “user” object into MongoDB.
package com.mkyong.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import com.mongodb.MongoClient;
/**
* Spring MongoDB configuration file
*
*/
@Configuration
public class SpringMongoConfig{
public @Bean
MongoTemplate mongoTemplate() throws Exception {
MongoTemplate mongoTemplate =
new MongoTemplate(new MongoClient("127.0.0.1"),"yourdb");
return mongoTemplate;
}
}
Uses @Document to define a “collection name” when you save this object. In this case, when “user” object saves, it will save into “users” collection.
package com.mkyong.user;
import java.util.Date;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.format.annotation.DateTimeFormat.ISO;
@Document(collection = "users")
public class User {
@Id
private String id;
@Indexed
private String ic;
private String name;
private int age;
@DateTimeFormat(iso = ISO.DATE_TIME)
private Date createdDate;
//getter and setter methods
}
Full examples to show you different ways of inserting data, read code and comments for self-explanatory.
package com.mkyong.core;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import com.mkyong.config.SpringMongoConfig;
import com.mkyong.user.User;
public class App {
public static void main(String[] args) {
// For Annotation
ApplicationContext ctx =
new AnnotationConfigApplicationContext(SpringMongoConfig.class);
MongoOperations mongoOperation =
(MongoOperations) ctx.getBean("mongoTemplate");
// Case1 - insert a user, put "tableA" as collection name
System.out.println("Case 1...");
User userA = new User("1000", "apple", 54, new Date());
mongoOperation.save(userA, "tableA");
// find
Query findUserQuery = new Query();
findUserQuery.addCriteria(Criteria.where("ic").is("1000"));
User userA1 = mongoOperation.findOne(findUserQuery, User.class, "tableA");
System.out.println(userA1);
// Case2 - insert a user, put entity as collection name
System.out.println("Case 2...");
User userB = new User("2000", "orange", 64, new Date());
mongoOperation.save(userB);
// find
User userB1 = mongoOperation.findOne(
new Query(Criteria.where("age").is(64)), User.class);
System.out.println(userB1);
// Case3 - insert a list of users
System.out.println("Case 3...");
User userC = new User("3000", "metallica", 34, new Date());
User userD = new User("4000", "metallica", 34, new Date());
User userE = new User("5000", "metallica", 34, new Date());
List<User> userList = new ArrayList<User>();
userList.add(userC);
userList.add(userD);
userList.add(userE);
mongoOperation.insert(userList, User.class);
// find
List<User> users = mongoOperation.find(
new Query(Criteria.where("name").is("metallica")),
User.class);
for (User temp : users) {
System.out.println(temp);
}
//save vs insert
System.out.println("Case 4...");
User userD1 = mongoOperation.findOne(
new Query(Criteria.where("age").is(64)), User.class);
userD1.setName("new name");
userD1.setAge(100);
//E11000 duplicate key error index, _id existed
//mongoOperation.insert(userD1);
mongoOperation.save(userD1);
User userE1 = mongoOperation.findOne(
new Query(Criteria.where("age").is(100)), User.class);
System.out.println(userE1);
}
}
Output
Case 1...
User [id=id, ic=1000, name=apple, age=54, createdDate=Sat Apr 06 12:35:15 MYT 2013]
Case 2...
User [id=id, ic=2000, name=orange, age=64, createdDate=Sat Apr 06 12:59:19 MYT 2013]
Case 3...
User [id=id, ic=3000, name=metallica, age=34, createdDate=Sat Apr 06 12:59:19 MYT 2013]
User [id=id, ic=4000, name=metallica, age=34, createdDate=Sat Apr 06 12:59:19 MYT 2013]
User [id=id, ic=5000, name=metallica, age=34, createdDate=Sat Apr 06 12:59:19 MYT 2013]
Case 4...
User [id=id, ic=2000, name=new name, age=100, createdDate=Sat Apr 06 12:59:19 MYT 2013]
3. Mongo Console
Review Mongo console, see what are inserted and created.
> mongo
MongoDB shell version: 2.2.3
connecting to: test
> show dbs
admin 0.203125GB
yourdb 0.203125GB
> use yourdb
switched to db yourdb
> show collections
system.indexes
tableA
users
> db.tableA.find()
{ "_id" : ObjectId("id"), "_class" : "com.mkyong.user.User",
"ic" : "1000", "name" : "apple", "age" : 54, "createdDate" : ISODate("2013-04-06T05:04:06.384Z") }
> db.users.find()
{ "_id" : ObjectId("id"), "_class" : "com.mkyong.user.User",
"ic" : "3000", "name" : "metallica", "age" : 34, "createdDate" : ISODate("2013-04-06T05:04:06.735Z") }
{ "_id" : ObjectId("id"), "_class" : "com.mkyong.user.User",
"ic" : "4000", "name" : "metallica", "age" : 34, "createdDate" : ISODate("2013-04-06T05:04:06.735Z") }
{ "_id" : ObjectId("id"), "_class" : "com.mkyong.user.User",
"ic" : "5000", "name" : "metallica", "age" : 34, "createdDate" : ISODate("2013-04-06T05:04:06.735Z") }
{ "_id" : ObjectId("id"), "_class" : "com.mkyong.user.User",
"ic" : "2000", "name" : "new name", "age" : 100, "createdDate" : ISODate("2013-04-06T05:04:06.731Z") }
P.S To remove the extra _class column, read this article – Spring Data MongoDB Remove _class Column.
when i save the content of file csv with repository interface saveAll,
I only receive the first line of data
Hi mkyong… Thankx for the tutorial… Could you tell me if you have a tutorial for this issue ?. I switch from boot to webflux and now the reactive version of spring data doesnt support things like @DbRef… So, when I save related documents, instead of saving them as documents from another collection it serializes as a nested document… do you know if there is a logic to solve this ?
hello, your tutorial is so great..I have a question. When we use the method findAll? do we have to difine a class before? If so how to determine its properties? I am Chinese, English is not well. thanks in advance.
date is saving 8 hrs less then current time, how to fix this one?
Thanks for sharing
Hi Mykong I am new to mongoDB and JAVA. I had gone through some your blogs and I understood that my objective of inserting a pdf in gridFS method is well suitable in Spring framework. Can you tell me the step by step procedure how to setup spring in eclipse kepler 4.3 and there by the example how I insert the pdf and then view the pdf. Thank you in advance.
Hi, In my case , making a separate MongoConfiguration class and extending it with AbstractMongoConfiguration did not solve the problem. It always gets connected to test db of mongo. what possibly might have gone wrong ? Any ideas!
Really found useful to me!
Hi,
Thanks for the quick tutorial. Really helped me in getting started with Mongo+Spring
User userD1 = mongoOperation.findOne(
new Query(Criteria.where(“age”).is(64)), User.class);
Why do we use User.class?
Any help will be appreciated!
thanks in Advance 🙂