如何在Spring Data MongoDB中使用低级驱动程序API

时间:2013-09-08 11:34:15

标签: spring spring-data mongodb-java spring-data-mongodb

我正在使用Spring Data MongoDB。但我不想将我的结果映射到域类。此外,我想在少数情况下访问低级MongoAB API。但我希望spring能够管理连接池等。

如何获得com.mongodb.MongoClient的实例来执行低级操作。 这是我想要做的:

MongoClient mongoClient = new MongoClient();
DB local = mongoClient.getDB("local");
DBCollection oplog = local.getCollection("oplog.$main");
DBCursor lastCursor = oplog.find().sort(new BasicDBObject("$natural", -1)).limit(1);

或者我只是想要一个JSON对象/ DBCursor / DBObject。

2 个答案:

答案 0 :(得分:2)

你可以这样做

@Autowired MongoDbFactory factory;
DB local = factory.getDB("local");
DBCollection oplog = local.getCollection("oplog.$main");
DBCursor lastCursor = oplog.find().sort(new BasicDBObject("$natural", -1)).limit(1);

哪里

MongoDbFactory is an interface provifed by spring-data-mongo that can obtain a        
com.mongodb.DB object and access allthe functionality of a specific MongoDB database   
instance

您的配置文件应包含以下信息:

<bean id="mongoFactoryBean"
class="org.springframework.data.mongodb.core.MongoFactoryBean">
    <property name="host" value="127.0.0.1"/>
    <property name="port" value="27017"/>
</bean>

<bean id="mongoDbFactory" 
class="org.springframework.data.mongodb.core.SimpleMongoDbFactory">
    <constructor-arg name="mongo" ref="mongoFactoryBean"/>
    <constructor-arg name="databaseName" value="local"/>
</bean>

这样做,spring应该继续管理你的连接池。

答案 1 :(得分:2)

您通常通过MongoTemplate的{​​{1}}方法执行低级访问,这些方法可以通过回调来访问本机Mongo驱动程序API。

execute(…)

此模板方法的优点是支持 class MyClient { private final MongoOperations operations; @Autowired public MyClient(MongoOperations mongoOperations) { this.operations = operations; } void yourMethod() { operations.execute(new CollectionCallback<YourDomainClass>() { YourDomainClass doInCollection(DBCollection collection) { // here goes your low-level code } }); } 接口的MongoTemplate实例仍将处理所有资源管理和异常转换(将所有Mongo特定异常转换为Spring MongoOperations层次)。

但是,对于您的具体示例,您可以直接执行以下操作:

DataAccessException

在这里,您可以混合并匹配传递给 Query query = new Query().with(new Sort(DESC, "$natural")).limit(1); DBObject result = operations.find(query, DBObject.class, "oplog.$main"); 方法的类型,以便模板将结果转换为find(…)或域对象(如果需要)。如上所述,您还可以获得上面的示例代码缺失的资源管理和异常转换。