정규표현식과 매치 되지 않는 정보 조회(mongodb regex not match)
where("scope").is(0).not().and("readers").not().regex(userID)
How to code with Spring data MongoDB for db.test.update({name:'abc'}, {$pull: {'child': {'age':10}}})
1 |
| |||
|
find one/several column(s) in a collection
1 | Can i use mongoTemplate or other class/interface to find one/several column(s) in a collection? For example, if i want to get only the name from collection: users(name, password, age, email) , how could i do? | |||
1 | You can specify the fields returned by the query with So in your case, assuming that user collection is mapped to
Another way would be o extends a MongoRepository and specify fields qith
edit By the looks of it |
출처 - http://stackoverflow.com/questions/12949870/spring-mongotemplate-find-special-column
Thursday, May 9, 2013
Simple Pagination for MongoDB Queries Using QueryDSL
...<plugin> <groupId>com.mysema.maven</groupId> <artifactId>maven-apt-plugin</artifactId> <version> 1.0 </version> <executions> <execution> <goals> <goal>process</goal> </goals> <configuration> <outputDirectory>target/generated-sources/java</outputDirectory> <processor>com.mysema.query.apt.QuerydslAnnotationProcessor</processor> </configuration> </execution> </executions> </plugin> ... <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-apt</artifactId> <version> 2.2 . 3 </version> </dependency> <dependency> <groupId>com.mysema.querydsl</groupId> <artifactId>querydsl-mongodb</artifactId> <version> 2.2 . 3 </version> </dependency> ... |
... @QueryEntity @Document (collection = "employees" ) public class Employee extends Person { ... |
Next I need to update the Spring Data Employee Repository interface to extend the QueryDslPredicateExecutor interface, type by my Employee model class. At this point it is important to note that for the this integration, I had to switch from the annotated Mongo Repository definition to extending the MongoRepository interface. The @RepositoryDefinitionannotation did not want to play nice with the QueryDslPredicateExecutor extension.
... // @RepositoryDefinition(domainClass = Employee.class, idClass = String.class) public interface EmployeeRepository extends MongoRepository<Employee, String>, QueryDslPredicateExecutor<Employee> { ... |
... public Page<Employee> findAllWithPages( int pageStart, int pageSize, Sort.Direction sortDirection, String sortField) { PageRequest pageRequest = new PageRequest(pageStart, pageSize, new Sort(Sort.Direction.ASC, "employeeId" )); return this .employeeRepository.findAll(pageRequest); } ... |
import static com.mysema.query.types.PathMetadataFactory.*; import com.mysema.query.types.*; import com.mysema.query.types.path.*; /** * QEmployee is a Querydsl query type for Employee */ public class QEmployee extends EntityPathBase<Employee> { private static final long serialVersionUID = - 236647047 ; public static final QEmployee employee = new QEmployee( "employee" ); public final QPerson _super = new QPerson( this ); public final SimplePath<Address> address = createSimple( "address" , Address. class ); //inherited public final DateTimePath<java.util.Date> birthDate = _super.birthDate; public final SimplePath<Department> department = createSimple( "department" , Department. class ); public final StringPath employeeId = createString( "employeeId" ); //inherited public final StringPath firstName = _super.firstName; public final DateTimePath<java.util.Date> hireDate = createDateTime( "hireDate" , java.util.Date. class ); //inherited public final StringPath id = _super.id; //inherited public final StringPath lastName = _super.lastName; //inherited public final StringPath middleName = _super.middleName; public final NumberPath<Integer> salary = createNumber( "salary" , Integer. class ); public final StringPath title = createString( "title" ); public QEmployee(String variable) { super (Employee. class , forVariable(variable)); } public QEmployee(BeanPath<? extends Employee> entity) { super (entity.getType(), entity.getMetadata()); } public QEmployee(PathMetadata<?> metadata) { super (Employee. class , metadata); } } |
Finally, below is the JUnit test that calls the pagination code generated for me.
package com.icfi.mongo; import static org.junit.Assert.assertEquals; import java.util.List; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.data.domain.Page; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoOperations; import com.icfi.mongo.data.loaders.EmployeeShortLoader; import com.icfi.mongo.data.model.Employee; import com.icfi.mongo.services.EmployeeService; public class PagingQueryTest { private static Logger log = LoggerFactory.getLogger(PagingQueryTest. class ); private ApplicationContext ctx; MongoOperations mongoOps; List<Employee> employees; EmployeeService employeeService; @Before public void setup() { ctx = new GenericXmlApplicationContext( "context/main.xml" ); mongoOps = (MongoOperations) ctx.getBean( "mongoTemplate" ); employeeService = (EmployeeService) ctx.getBean( "employeeService" ); EmployeeShortLoader.main( null ); } @Test public void testPaging() { String[] lastNames = new String[] { "Stanfel" , "Gustavson" , "Lortz" , "Marquardt" , "Unno" , "Savasere" , "Spelt" , "Wynblatt" , "Danecki" , "Weedman" , "Hartvigsen" , "Menhoudj" , "Heyers" , "Willoner" , "Shumilov" , "Zuberek" , "Boguraev" }; int pageCount = 10 ; int pageNumber = 0 ; String sortField = "employeeId" ; Sort.Direction sortOrder = Sort.Direction.ASC; Page<Employee> employeesPage = employeeService.findAllWithPages( pageNumber, pageCount, sortOrder, sortField); while (employeesPage.hasNextPage()) { assertEquals( "List size is incorrect." , pageCount, employeesPage.getSize()); log.info( "Page Number = " + pageNumber); if (employeesPage.hasContent()) { log.info(employeesPage.getContent() .get(employeesPage.getSize() - 1 ).getLastName()); assertEquals( "Last name was incorrect." , lastNames[pageNumber], employeesPage.getContent() .get(employeesPage.getSize() - 1 ).getLastName()); } pageNumber++; employeesPage = employeeService.findAllWithPages(pageNumber, pageCount, sortOrder, sortField); } log.info( "Page Number = " + pageNumber); employeesPage = employeeService.findAllWithPages(pageNumber, pageCount, sortOrder, sortField); log.info(employeesPage.getContent() .get(employeesPage.getContent().size() - 1 ).getLastName()); assertEquals( "Last name was incorrect." , lastNames[pageNumber], employeesPage.getContent() .get(employeesPage.getContent().size() - 1 ) .getLastName()); } @After public void tearDown() { this .mongoOps.getCollection( "employees" ).drop(); } } |
With this approach I have quickly added pagination to my MongoDB queries, while writing minimal code.
출처 - http://jimmyraywv.blogspot.kr/2013/05/simple-pagination-for-mongodb-queries.html
Spring Data MongoDB : Update Document
In Spring data – MongoDB, you can use following methods to update documents.
- save – Update the whole object, if “_id” is present, perform an update, else insert it.
- updateFirst – Updates the first document that matches the query.
- updateMulti – Updates all documents that match the query.
- Upserting – If no document that matches the query, a new document is created by combining the query and update object.
- findAndModify – Same with updateMulti, but it has an extra option to return either the old or newly updated document.
P.S All examples are tested under mongo-java-driver-2.11.0.jar
and spring-data-mongodb-1.2.0.RELEASE.jar
1. saveOrUpdate – part 1 example
Assume below json data is inserted into MongoDB.
{ "_id" : ObjectId("id"), "ic" : "1001", "name" : "appleA", "age" : 20, "createdDate" : ISODate("2013-04-06T23:17:35.530Z") }
Find the document, modify and update it with save()
method.
Query query = new Query(); query.addCriteria(Criteria.where("name").is("appleA")); User userTest1 = mongoOperation.findOne(query, User.class); System.out.println("userTest1 - " + userTest1); //modify and update with save() userTest1.setAge(99); mongoOperation.save(userTest1); //get the updated object again User userTest1_1 = mongoOperation.findOne(query, User.class); System.out.println("userTest1_1 - " + userTest1_1);
Output
userTest1 - User [id=id, ic=1001, name=appleA, age=20, createdDate=Sat Apr 06 23:17:35 MYT 2013] userTest1_1 - User [id=id, ic=1001, name=appleA, age=99, createdDate=Sat Apr 06 23:17:35 MYT 2013]
See example 2, it shows a common mistake made by most of the developers.
2. saveOrUpdate - part 2 example
This is a failed example, read carefully, a really common mistake.
Assume below json data is inserted into MongoDB.
{ "_id" : ObjectId("id"), "ic" : "1002", "name" : "appleB", "age" : 20, "createdDate" : ISODate("2013-04-06T15:22:34.530Z") }
In Query
, you get the document returned with a single "name" field value only, it did happened often to save the object returned size. The returned "User" object has null value in the fields : age, ic and createdDate, if you modify the 'age' field and update it, it will override everything instead of update the modified field - 'age'.
Query query = new Query(); query.addCriteria(Criteria.where("name").is("appleB")); query.fields().include("name"); User userTest2 = mongoOperation.findOne(query, User.class); System.out.println("userTest2 - " + userTest2); userTest2.setAge(99); mongoOperation.save(userTest2); // ooppss, you just override everything, it caused ic=null and // createdDate=null Query query1 = new Query(); query1.addCriteria(Criteria.where("name").is("appleB")); User userTest2_1 = mongoOperation.findOne(query1, User.class); System.out.println("userTest2_1 - " + userTest2_1);
Output
userTest2 - User [id=51603dba3004d7fffc202391, ic=null, name=appleB, age=0, createdDate=null] userTest2_1 - User [id=51603dba3004d7fffc202391, ic=null, name=appleB, age=99, createdDate=null]
After the save(), the field 'age' is updated correctly, but ic and createdDate are both set to null, the entire "user" object is updated. To update a single field / key value, don't use save(), use updateFirst() or updateMulti() instead.
3. updateFirst example
Updates the first document that matches the query. In this case, only the single field "age" is updated.
{ "_id" : ObjectId("id"), "ic" : "1003", "name" : "appleC", "age" : 20, "createdDate" : ISODate("2013-04-06T23:22:34.530Z") }
//returns only 'name' field Query query = new Query(); query.addCriteria(Criteria.where("name").is("appleC")); query.fields().include("name"); User userTest3 = mongoOperation.findOne(query, User.class); System.out.println("userTest3 - " + userTest3); Update update = new Update(); update.set("age", 100); mongoOperation.updateFirst(query, update, User.class); //returns everything Query query1 = new Query(); query1.addCriteria(Criteria.where("name").is("appleC")); User userTest3_1 = mongoOperation.findOne(query1, User.class); System.out.println("userTest3_1 - " + userTest3_1);
Output
userTest3 - User [id=id, ic=null, name=appleC, age=0, createdDate=null] userTest3_1 - User [id=id, ic=1003, name=appleC, age=100, createdDate=Sat Apr 06 23:22:34 MYT 2013]
4. updateMulti example
Updates all documents that matches the query.
{ "_id" : ObjectId("id"), "ic" : "1004", "name" : "appleD", "age" : 20, "createdDate" : ISODate("2013-04-06T15:22:34.530Z") } { "_id" : ObjectId("id"), "ic" : "1005", "name" : "appleE", "age" : 20, "createdDate" : ISODate("2013-04-06T15:22:34.530Z") }
//show the use of $or operator Query query = new Query(); query.addCriteria(Criteria .where("name").exists(true) .orOperator(Criteria.where("name").is("appleD"), Criteria.where("name").is("appleE"))); Update update = new Update(); //update age to 11 update.set("age", 11); //remove the createdDate field update.unset("createdDate"); // if use updateFirst, it will update 1004 only. // mongoOperation.updateFirst(query4, update4, User.class); // update all matched, both 1004 and 1005 mongoOperation.updateMulti(query, update, User.class); System.out.println(query.toString()); List<User> usersTest4 = mongoOperation.find(query4, User.class); for (User userTest4 : usersTest4) { System.out.println("userTest4 - " + userTest4); }
Output
Query: { "name" : { "$exists" : true} , "$or" : [ { "name" : "appleD"} , { "name" : "appleE"}]}, Fields: null, Sort: null userTest4 - User [id=id, ic=1004, name=appleD, age=11, createdDate=null] userTest4 - User [id=id, ic=1005, name=appleE, age=11, createdDate=null]
5. Upsert example
If document is matched, update it, else create a new document by combining the query and update object, it's works likefindAndModifyElseCreate()
:)
{ //no data }
//search a document that doesn't exist Query query = new Query(); query.addCriteria(Criteria.where("name").is("appleZ")); Update update = new Update(); update.set("age", 21); mongoOperation.upsert(query, update, User.class); User userTest5 = mongoOperation.findOne(query, User.class); System.out.println("userTest5 - " + userTest5);
Output, a new document is created by combining both query and update object.
userTest5 - User [id=id, ic=null, name=appleZ, age=21, createdDate=null]
6. findAndModify example
Find and modify and get the newly updated object from a single operation.
{ "_id" : ObjectId("id"), "ic" : "1006", "name" : "appleF", "age" : 20, "createdDate" : ISODate("2013-04-07T13:11:34.530Z") }
Query query6 = new Query(); query6.addCriteria(Criteria.where("name").is("appleF")); Update update6 = new Update(); update6.set("age", 101); update6.set("ic", 1111); //FindAndModifyOptions().returnNew(true) = newly updated document //FindAndModifyOptions().returnNew(false) = old document (not update yet) User userTest6 = mongoOperation.findAndModify( query6, update6, new FindAndModifyOptions().returnNew(true), User.class); System.out.println("userTest6 - " + userTest6);
Output
userTest6 - User [id=id, ic=1111, name=appleF, age=101, createdDate=Sun Apr 07 13:11:34 MYT 2013]
7. Full example
Full application to combine everything from example 1 to 6.
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.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import com.mkyong.config.SpringMongoConfig; import com.mkyong.model.User; public class UpdateApp { public static void main(String[] args) { // For Annotation ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig.class); MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); // insert 6 users for testing List<User> users = new ArrayList<User>(); User user1 = new User("1001", "appleA", 20, new Date()); User user2 = new User("1002", "appleB", 20, new Date()); User user3 = new User("1003", "appleC", 20, new Date()); User user4 = new User("1004", "appleD", 20, new Date()); User user5 = new User("1005", "appleE", 20, new Date()); User user6 = new User("1006", "appleF", 20, new Date()); users.add(user1); users.add(user2); users.add(user3); users.add(user4); users.add(user5); users.add(user6); mongoOperation.insert(users, User.class); // Case 1 ... find and update System.out.println("Case 1"); Query query1 = new Query(); query1.addCriteria(Criteria.where("name").is("appleA")); User userTest1 = mongoOperation.findOne(query1, User.class); System.out.println("userTest1 - " + userTest1); userTest1.setAge(99); mongoOperation.save(userTest1); User userTest1_1 = mongoOperation.findOne(query1, User.class); System.out.println("userTest1_1 - " + userTest1_1); // Case 2 ... select single field only System.out.println("\nCase 2"); Query query2 = new Query(); query2.addCriteria(Criteria.where("name").is("appleB")); query2.fields().include("name"); User userTest2 = mongoOperation.findOne(query2, User.class); System.out.println("userTest2 - " + userTest2); userTest2.setAge(99); mongoOperation.save(userTest2); // ooppss, you just override everything, it caused ic=null and // createdDate=null Query query2_1 = new Query(); query2_1.addCriteria(Criteria.where("name").is("appleB")); User userTest2_1 = mongoOperation.findOne(query2_1, User.class); System.out.println("userTest2_1 - " + userTest2_1); System.out.println("\nCase 3"); Query query3 = new Query(); query3.addCriteria(Criteria.where("name").is("appleC")); query3.fields().include("name"); User userTest3 = mongoOperation.findOne(query3, User.class); System.out.println("userTest3 - " + userTest3); Update update3 = new Update(); update3.set("age", 100); mongoOperation.updateFirst(query3, update3, User.class); Query query3_1 = new Query(); query3_1.addCriteria(Criteria.where("name").is("appleC")); User userTest3_1 = mongoOperation.findOne(query3_1, User.class); System.out.println("userTest3_1 - " + userTest3_1); System.out.println("\nCase 4"); Query query4 = new Query(); query4.addCriteria(Criteria .where("name") .exists(true) .orOperator(Criteria.where("name").is("appleD"), Criteria.where("name").is("appleE"))); Update update4 = new Update(); update4.set("age", 11); update4.unset("createdDate"); // update 1004 only. // mongoOperation.updateFirst(query4, update4, User.class); // update all matched mongoOperation.updateMulti(query4, update4, User.class); System.out.println(query4.toString()); List<User> usersTest4 = mongoOperation.find(query4, User.class); for (User userTest4 : usersTest4) { System.out.println("userTest4 - " + userTest4); } System.out.println("\nCase 5"); Query query5 = new Query(); query5.addCriteria(Criteria.where("name").is("appleZ")); Update update5 = new Update(); update5.set("age", 21); mongoOperation.upsert(query5, update5, User.class); User userTest5 = mongoOperation.findOne(query5, User.class); System.out.println("userTest5 - " + userTest5); System.out.println("\nCase 6"); Query query6 = new Query(); query6.addCriteria(Criteria.where("name").is("appleF")); Update update6 = new Update(); update6.set("age", 101); update6.set("ic", 1111); User userTest6 = mongoOperation.findAndModify(query6, update6, new FindAndModifyOptions().returnNew(true), User.class); System.out.println("userTest6 - " + userTest6); mongoOperation.dropCollection(User.class); } }
Output
Case 1 userTest1 - User [id=id, ic=1001, name=appleA, age=20, createdDate=Sun Apr 07 13:22:48 MYT 2013] userTest1_1 - User [id=id, ic=1001, name=appleA, age=99, createdDate=Sun Apr 07 13:22:48 MYT 2013] Case 2 userTest2 - User [id=id, ic=null, name=appleB, age=0, createdDate=null] userTest2_1 - User [id=id, ic=null, name=appleB, age=99, createdDate=null] Case 3 userTest3 - User [id=id, ic=null, name=appleC, age=0, createdDate=null] userTest3_1 - User [id=id, ic=1003, name=appleC, age=100, createdDate=Sun Apr 07 13:22:48 MYT 2013] Case 4 Query: { "name" : { "$exists" : true} , "$or" : [ { "name" : "appleD"} , { "name" : "appleE"}]}, Fields: null, Sort: null userTest4 - User [id=id, ic=1004, name=appleD, age=11, createdDate=null] userTest4 - User [id=id, ic=1005, name=appleE, age=11, createdDate=null] Case 5 userTest5 - User [id=id, ic=null, name=appleZ, age=21, createdDate=null] Case 6 userTest6 - User [id=id, ic=1006, name=appleF, age=20, createdDate=Sun Apr 07 13:22:48 MYT 2013]
출처 - http://www.mkyong.com/mongodb/spring-data-mongodb-update-document/
Here we show you a few examples to query documents from MongoDB, by using Query, Criteria and along with some of the common operators.
Test Data
> db.users.find() { "_id" : ObjectId("id"), "ic" : "1001", "name" : "ant", "age" : 10 } { "_id" : ObjectId("id"), "ic" : "1002", "name" : "bird", "age" : 20 } { "_id" : ObjectId("id"), "ic" : "1003", "name" : "cat", "age" : 30 } { "_id" : ObjectId("id"), "ic" : "1004", "name" : "dog", "age" : 40 } { "_id" : ObjectId("id"), "ic" : "1005", "name" : "elephant", "age" : 50 } { "_id" : ObjectId("id"), "ic" : "1006", "name" : "frog", "age" : 60 }
P.S This example is tested under mongo-java-driver-2.11.0.jar
and spring-data-mongodb-1.2.0.RELEASE.jar
1. BasicQuery example
If you are familiar with the core MongoDB console find() command, just put the “raw” query inside the BasicQuery
.
BasicQuery query1 = new BasicQuery("{ age : { $lt : 40 }, name : 'cat' }"); User userTest1 = mongoOperation.findOne(query1, User.class); System.out.println("query1 - " + query1.toString()); System.out.println("userTest1 - " + userTest1);
Output
query1 - Query: { "age" : { "$lt" : 40} , "name" : "cat"}, Fields: null, Sort: { } userTest1 - User [id=id, ic=1003, name=cat, age=30]
2. findOne example
findOne will return the single document that matches the query, and you can a combine few criteria with Criteria.and()
method. See example 4 for more details.
Query query2 = new Query(); query2.addCriteria(Criteria.where("name").is("dog").and("age").is(40)); User userTest2 = mongoOperation.findOne(query2, User.class); System.out.println("query2 - " + query2.toString()); System.out.println("userTest2 - " + userTest2);
Output
query2 - Query: { "name" : "dog" , "age" : 40}, Fields: null, Sort: null userTest2 - User [id=id, ic=1004, name=dog, age=40]
3. find and $inc example
Find and return a list of documents that match the query. This example also shows the use of $inc
operator.
List<Integer> listOfAge = new ArrayList<Integer>(); listOfAge.add(10); listOfAge.add(30); listOfAge.add(40); Query query3 = new Query(); query3.addCriteria(Criteria.where("age").in(listOfAge)); List<User> userTest3 = mongoOperation.find(query3, User.class); System.out.println("query3 - " + query3.toString()); for (User user : userTest3) { System.out.println("userTest3 - " + user); }
Output
query3 - Query: { "age" : { "$in" : [ 10 , 30 , 40]}}, Fields: null, Sort: null userTest3 - User [id=id, ic=1001, name=ant, age=10] userTest3 - User [id=id, ic=1003, name=cat, age=30] userTest3 - User [id=id, ic=1004, name=dog, age=40]
4. find and $gt, $lt, $and example
Find and return a list of documents that match the query. This example also shows the use of $gt
, $lt
and $and
operators.
Query query4 = new Query(); query4.addCriteria(Criteria.where("age").lt(40).and("age").gt(10)); List<User> userTest4 = mongoOperation.find(query4, User.class); System.out.println("query4 - " + query4.toString()); for (User user : userTest4) { System.out.println("userTest4 - " + user); }
Oppss, an error message is generated, the API doen’t works in this way :)
Due to limitations of the com.mongodb.BasicDBObject, you can't add a second 'age' expression specified as 'age : { "$gt" : 10}'. Criteria already contains 'age : { "$lt" : 40}'.
You can’t use Criteria.and()
to add multiple criteria into the same field, to fix it, use Criteria.andOperator()
, see updated example :
Query query4 = new Query(); query4.addCriteria( Criteria.where("age").exists(true) .andOperator( Criteria.where("age").gt(10), Criteria.where("age").lt(40) ) ); List<User> userTest4 = mongoOperation.find(query4, User.class); System.out.println("query4 - " + query4.toString()); for (User user : userTest4) { System.out.println("userTest4 - " + user); }
Output
query4 - Query: { "age" : { "$lt" : 40} , "$and" : [ { "age" : { "$gt" : 10}}]}, Fields: null, Sort: null userTest4 - User [id=51627a0a3004cc5c0af72964, ic=1002, name=bird, age=20] userTest4 - User [id=51627a0a3004cc5c0af72965, ic=1003, name=cat, age=30]
5. find and sorting example
Find and sort the result.
Query query5 = new Query(); query5.addCriteria(Criteria.where("age").gte(30)); query5.with(new Sort(Sort.Direction.DESC, "age")); List<User> userTest5 = mongoOperation.find(query5, User.class); System.out.println("query5 - " + query5.toString()); for (User user : userTest5) { System.out.println("userTest5 - " + user); }
Output
query5 - Query: { "age" : { "$gte" : 30}}, Fields: null, Sort: { "age" : -1} userTest5 - User [id=id, ic=1006, name=frog, age=60] userTest5 - User [id=id, ic=1005, name=elephant, age=50] userTest5 - User [id=id, ic=1004, name=dog, age=40] userTest5 - User [id=id, ic=1003, name=cat, age=30]
6. find and $regex example
Find by regular expression pattern.
Query query6 = new Query(); query6.addCriteria(Criteria.where("name").regex("D.*G", "i")); List<User> userTest6 = mongoOperation.find(query6, User.class); System.out.println("query6 - " + query6.toString()); for (User user : userTest6) { System.out.println("userTest6 - " + user); }
Output
query6 - Query: { "name" : { "$regex" : "D.*G" , "$options" : "i"}}, Fields: null, Sort: null userTest6 - User [id=id, ic=1004, name=dog, age=40]
7. Full Example
A full example to combine everything from example 1 to 6.
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; } }
package com.mkyong.model; 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; //getter, setter and constructor methods }
package com.mkyong.core; import java.util.ArrayList; import java.util.List; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import com.mkyong.config.SpringMongoConfig; import com.mkyong.model.User; /** * Query example * * @author mkyong * */ public class QueryApp { public static void main(String[] args) { ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringMongoConfig.class); MongoOperations mongoOperation = (MongoOperations) ctx.getBean("mongoTemplate"); // insert 6 users for testing List<User> users = new ArrayList<User>(); User user1 = new User("1001", "ant", 10); User user2 = new User("1002", "bird", 20); User user3 = new User("1003", "cat", 30); User user4 = new User("1004", "dog", 40); User user5 = new User("1005", "elephant",50); User user6 = new User("1006", "frog", 60); users.add(user1); users.add(user2); users.add(user3); users.add(user4); users.add(user5); users.add(user6); mongoOperation.insert(users, User.class); System.out.println("Case 1 - find with BasicQuery example"); BasicQuery query1 = new BasicQuery("{ age : { $lt : 40 }, name : 'cat' }"); User userTest1 = mongoOperation.findOne(query1, User.class); System.out.println("query1 - " + query1.toString()); System.out.println("userTest1 - " + userTest1); System.out.println("\nCase 2 - find example"); Query query2 = new Query(); query2.addCriteria(Criteria.where("name").is("dog").and("age").is(40)); User userTest2 = mongoOperation.findOne(query2, User.class); System.out.println("query2 - " + query2.toString()); System.out.println("userTest2 - " + userTest2); System.out.println("\nCase 3 - find list $inc example"); List<Integer> listOfAge = new ArrayList<Integer>(); listOfAge.add(10); listOfAge.add(30); listOfAge.add(40); Query query3 = new Query(); query3.addCriteria(Criteria.where("age").in(listOfAge)); List<User> userTest3 = mongoOperation.find(query3, User.class); System.out.println("query3 - " + query3.toString()); for (User user : userTest3) { System.out.println("userTest3 - " + user); } System.out.println("\nCase 4 - find list $and $lt, $gt example"); Query query4 = new Query(); // it hits error // query4.addCriteria(Criteria.where("age").lt(40).and("age").gt(10)); query4.addCriteria( Criteria.where("age").exists(true).andOperator( Criteria.where("age").gt(10), Criteria.where("age").lt(40) ) ); List<User> userTest4 = mongoOperation.find(query4, User.class); System.out.println("query4 - " + query4.toString()); for (User user : userTest4) { System.out.println("userTest4 - " + user); } System.out.println("\nCase 5 - find list and sorting example"); Query query5 = new Query(); query5.addCriteria(Criteria.where("age").gte(30)); query5.with(new Sort(Sort.Direction.DESC, "age")); List<User> userTest5 = mongoOperation.find(query5, User.class); System.out.println("query5 - " + query5.toString()); for (User user : userTest5) { System.out.println("userTest5 - " + user); } System.out.println("\nCase 6 - find by regex example"); Query query6 = new Query(); query6.addCriteria(Criteria.where("name").regex("D.*G", "i")); List<User> userTest6 = mongoOperation.find(query6, User.class); System.out.println("query6 - " + query6.toString()); for (User user : userTest6) { System.out.println("userTest6 - " + user); } mongoOperation.dropCollection(User.class); } }
Output
Case 1 - find with BasicQuery example query1 - Query: { "age" : { "$lt" : 40} , "name" : "cat"}, Fields: null, Sort: { } userTest1 - User [id=id, ic=1003, name=cat, age=30] Case 2 - find example query2 - Query: { "name" : "dog" , "age" : 40}, Fields: null, Sort: null userTest2 - User [id=id, ic=1004, name=dog, age=40] Case 3 - find list $inc example query3 - Query: { "age" : { "$in" : [ 10 , 30 , 40]}}, Fields: null, Sort: null userTest3 - User [id=id, ic=1001, name=ant, age=10] userTest3 - User [id=id, ic=1003, name=cat, age=30] userTest3 - User [id=id, ic=1004, name=dog, age=40] Case 4 - find list $and $lt, $gt example query4 - Query: { "age" : { "$lt" : 40} , "$and" : [ { "age" : { "$gt" : 10}}]}, Fields: null, Sort: null userTest4 - User [id=id, ic=1002, name=bird, age=20] userTest4 - User [id=id, ic=1003, name=cat, age=30] Case 5 - find list and sorting example query5 - Query: { "age" : { "$gte" : 30}}, Fields: null, Sort: { "age" : -1} userTest5 - User [id=id, ic=1006, name=frog, age=60] userTest5 - User [id=id, ic=1005, name=elephant, age=50] userTest5 - User [id=id, ic=1004, name=dog, age=40] userTest5 - User [id=id, ic=1003, name=cat, age=30] Case 6 - find by regex example query6 - Query: { "name" : { "$regex" : "D.*G" , "$options" : "i"}}, Fields: null, Sort: null userTest6 - User [id=id, ic=1004, name=dog, age=40]
출처 - http://www.mkyong.com/mongodb/spring-data-mongodb-query-document/
'Framework & Platform > Spring' 카테고리의 다른 글
spring data - mongodb 도메인 객체에서 사용되는 annotation (0) | 2013.06.06 |
---|---|
spring data - Spring Data MongoDB Remove _class field (0) | 2013.06.03 |
spring data - mongodb 설정 예제 (0) | 2013.05.19 |
spring - ehcache config (0) | 2013.04.16 |
spring - PropertyPlaceholderConfigurer(Property 값 읽어오기) (0) | 2013.03.10 |