【问题标题】:How to use low-level driver APIs with Spring Data MongoDB如何在 Spring Data MongoDB 中使用低级驱动程序 API
【发布时间】:2013-09-08 11:34:15
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你可以这样做

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

    【讨论】:

      【解决方案2】:

      您通常通过MongoTemplateexecute(…) 方法执行低级访问,这些方法接受回调,让您可以访问本机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
             }
           });
         }
      

      这种模板方法的优点是支持MongoOperations 接口的MongoTemplate 实例仍将负责所有资源管理和异常转换(将所有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 或域对象(如果需要)。如上所示,您还可以获得上述示例代码所缺少的资源管理和异常翻译。

      【讨论】:

        猜你喜欢
        • 2018-06-06
        • 2016-12-26
        • 1970-01-01
        • 1970-01-01
        • 2019-01-27
        • 1970-01-01
        • 2022-10-01
        • 2015-10-25
        • 1970-01-01
        相关资源
        最近更新 更多