我正在使用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。
答案 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(…)
或域对象(如果需要)。如上所述,您还可以获得上面的示例代码缺失的资源管理和异常转换。