5

我正在使用 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。

4

2 回答 2

3

你可以这样做

@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 应该继续管理你的连接池。

于 2013-09-10T14:17:36.240 回答
3

MongoTemplate您通常通过's方法执行低级访问,execute(…)这些方法接受回调,使您可以访问本机 Mongo 驱动程序 API。

 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支持接口的实例MongoOperations仍将负责所有资源管理和异常转换(将所有 Mongo 特定异常转换为 Spring 的DataAccessException层次结构)。

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

 Query query = new Query().with(new Sort(DESC, "$natural")).limit(1);
 DBObject result = operations.find(query, DBObject.class, "oplog.$main");

在这里,您可以混合和匹配您传递给find(…)方法的类型,以便让模板在需要时将结果转换为Map域对象或域对象。如上所述,您还可以获得上面的示例代码缺少的资源管理和异常翻译。

于 2013-09-19T15:16:06.510 回答