在開始之前,請下載并運行適用于您的操作系統的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