在开始之前,请下载并运行适用于您的操作系统的MongoDB 。 这非常简单,所以我不会花时间在上面,让我们从我们项目的简单POM文件开始:
4.0.0
mongodb
com.example.spring
0.0.1-SNAPSHOT
jar
UTF-8
3.0.5.RELEASE
org.springframework.data
spring-data-mongodb
1.0.0.M3
log4j
log4j
1.2.16
org.mongodb
mongo-java-driver
2.5.3
org.springframework
spring-core
${spring.version}
org.springframework
spring-context
${spring.version}
springsource-milestone
Spring Framework Milestone Repository
http://maven.springframework.org/milestone
这里有两个关键的依赖关系:
– MongoDB Java驱动程序
– MongoDB的 Spring数据
在Spring应用程序上下文中几乎没有定义MongoDB的方法。 让我显示一个较为冗长但更灵活的示例:
<beans xmlns:context="http://www.springframework.org/schema/context" xmlns:mongo="http://www.springframework.org/schema/data/mongo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<constructor-arg index="0" ref="mongo" />
<constructor-arg index="1" value="elements-db"/>
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="converter" />
<property name="writeResultChecking" value="EXCEPTION" />
<property name="writeConcern" value="NORMAL"/>
这里每个bean的作用:
- mongo定义到MongoDB数据库的连接(我们依赖于默认设置,端口27027)
- 转换器用于将Java类与MongoDB的 DBObject之间进行转换(== JSON)
- mongoTemplate公开了我们可以通过MongoDB执行的操作
因此,我们准备出发了!
以下是一些开始的代码段:
package com.example.mongodb;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.query.Index;
import org.springframework.data.document.mongodb.query.Index.Duplicates;
import org.springframework.data.document.mongodb.query.Order;
import org.springframework.stereotype.Service;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;
@Service
public class MongoService {
@Autowired private MongoOperations template;
public void createCollection( final String name ) {
template.createCollection( name );
}
public void dropCollection( final String name ) {
template.dropCollection( name );
}
public void insert( final Object object, final String collection ) {
template.insert( object, collection );
}
public void createIndex( final String name, final String collection ) {
template.ensureIndex(
new Index()
.on( name, Order.DESCENDING )
.unique( Duplicates.DROP ),
collection
);
}
// Remove / save / ... operations here
}
基本知识就是这样。 下一篇文章将介绍高级功能:使用批量插入,更新或插入操作以及执行MongoDB命令。 :)
在讨论了MongoDB和Spring Data项目之后,我想展示一些高级功能(可以在下一个Spring Data里程碑或作为核心功能的一部分发布的功能)。
首先,让我们使用一种方法对MongoService进行扩展,该方法对集合中与特定查询匹配的文档进行计数。
package com.example.mongodb;
import java.util.Arrays;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;
import org.springframework.data.document.mongodb.MongoOperations;
import org.springframework.data.document.mongodb.convert.MongoConverter;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Index;
import org.springframework.data.document.mongodb.query.Index.Duplicates;
import org.springframework.data.document.mongodb.query.Order;
import org.springframework.data.document.mongodb.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;
@Service
public class MongoService {
public long countDocuments( final String collection, final Query query ) {
return template.executeCommand(
"{ " +
"\"count\" : \"" + collection + "\"," +
"\"query\" : " + query.getQueryObject().toString() +
" }" ).getLong( "n" );
}
}
此特定功能的方法是调用本地MongoDB命令计数 ,并将查询作为参数传递。 返回的结构包含n个属性中的文档数。
或者,以更友好的代码方式:
import org.springframework.dao.DataAccessException;
import org.springframework.data.document.mongodb.CollectionCallback;
import com.mongodb.DBCollection;
import com.mongodb.MongoException;
public long countDocuments( final String collection, final Query query ) {
return template.execute( collection,
new CollectionCallback< Long >() {
@Override
public Long doInCollection( DBCollection collection )
throws MongoException, DataAccessException {
return collection.count( q.getQueryObject() ) );
}
}
);
}
下一个有用的功能是批量插入。 请注意,在当前版本的MongoDB 1.8.1中, 当插入文档集合中存在重复项时,批量插入在第一个重复项上停止并返回,因此不会插入所有其他文档 。 请注意这种行为。 在转到代码片段之前,让我介绍简单的类SimpleDocument ,我们将坚持该类到MongoDB :
package com.example.mongodb;
import org.springframework.data.document.mongodb.mapping.Document;
@Document( collection = "documents" )
public class SimpleDocument {
private String id;
private String name;
private String content;
public SimpleDocument() {
}
public SimpleDocument( final String id, final String name ) {
this.id = id;
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
以下方法将所有文档作为单个批量更新插入:
public void insert( final Collection< SimpleDocument > documents ) {
template.insert( documents, SimpleDocument.class );
}
另一个非常酷而有用的功能是MongoDB的 upserts (有关更多信息,请访问http://www.mongodb.org/display/DOCS/Updating):如果存在符合特定条件的文档,则将对其进行更新,否则–新文档被插入收藏。 以下是通过以下用例演示的代码:如果存在具有此类名称的 SimpleDocument ,它将被更新,否则将新文档添加到集合中:
@Autowired private MongoConverter converter;
public void insertOrUpdate( final SimpleDocument document ) {
final BasicDBObject dbDoc = new BasicDBObject();
converter.write( document, dbDoc );
template.execute( SimpleDocument.class,
new CollectionCallback< Object >() {
public Object doInCollection( DBCollection collection )
throws MongoException, DataAccessException {
collection.update(
new Query()
.addCriteria( new Criteria( "name" ).is( document.getName() ) )
.getQueryObject(),
dbDoc,
true,
false
);
return null;
}
}
);
}
请注意转换器 bean的用法,它有助于将Java类转换为MongoDB的 DBObject。
我要显示的最后一个是findAndModify操作,它作为一个原子序列执行几项操作:
–查找文档匹配条件
–执行更新
–返回更新的文档(或旧文档,取决于您的需求)
public void findAndModify( final Query query, final Update update ) {
return template.execute( SimpleDocument.class,
new CollectionCallback< SimpleDocument >() {
@Override
public SimpleDocument doInCollection( DBCollection collection )
throws MongoException, DataAccessException {
return converter.read( SimpleDocument.class,
collection.findAndModify(
query.getQueryObject(),
null,
null,
false,
update.getUpdateObject(),
true,
false
)
);
}
}
);
}
现在,这些都是我遇到的有趣的用例。 老实说,我对MongoDB感到非常兴奋,并强烈建议它适合您的应用程序。
参考: 与Spring Data项目一起开发MongoDB:基本概念和 与Spring Data项目一起利用MongoDB:来自我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上的高级概念 。
翻译自: https://www.javacodegeeks.com/2012/01/mongodb-with-spring-data-project.html