在开始之前,请下载并运行适用于您的操作系统的MongoDB 。 这非常简单,所以我不会花时间在上面,让我们从我们项目的简单POM文件开始:
4.0.0mongodbcom.example.spring0.0.1-SNAPSHOTjarUTF-83.0.5.RELEASEorg.springframework.dataspring-data-mongodb1.0.0.M3log4jlog4j1.2.16org.mongodbmongo-java-driver2.5.3org.springframeworkspring-core${spring.version}org.springframeworkspring-context${spring.version}springsource-milestoneSpring Framework Milestone Repositoryhttp://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.xsdhttp://www.springframework.org/schema/data/mongohttp://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsdhttp://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 >() {@Overridepublic 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 >() {@Overridepublic 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