标签: spring-data-mongodb

Spring Data的MongoTemplate和MongoRepository有什么区别?

我需要编写一个应用程序,我可以使用spring-data和mongodb进行复杂的查询.我一直在使用MongoRepository开始,但在复杂的查询中苦苦寻找示例或实际理解语法.

我在谈论这样的查询:

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    List<User> findByEmailOrLastName(String email, String lastName);
}
Run Code Online (Sandbox Code Playgroud)

或者使用基于JSON的查询,我尝试通过反复试验,因为我没有正确的语法.即使在阅读了mongodb文档(由于语法错误而导致的非工作示例).

@Repository
public interface UserRepositoryInterface extends MongoRepository<User, String> {
    @Query("'$or':[{'firstName':{'$regex':?0,'$options':'i'}},{'lastName':{'$regex':?0,'$options':'i'}}]")
    List<User> findByEmailOrFirstnameOrLastnameLike(String searchText);
} 
Run Code Online (Sandbox Code Playgroud)

阅读完所有文档后,似乎mongoTemplate记录得更好MongoRepository.我指的是以下文档:

http://static.springsource.org/spring-data/data-mongodb/docs/current/reference/html/

你能告诉我什么更方便,更强大吗?mongoTemplate还是MongoRepository?两者是否同样成熟,或者其中一个缺少比另一个更多的功能?

java spring mongodb spring-data spring-data-mongodb

79
推荐指数
3
解决办法
6万
查看次数

MongoDB-CR身份验证失败

我在验证用户时遇到以下错误:purchase_user @ purchase failed.MongoDB-CR身份验证失败.我通过浏览器访问webservice时缺少用户文档中的凭据.

但我可以从mongo验证purchase_user,它返回1.

mongodb spring-data-mongodb

47
推荐指数
5
解决办法
4万
查看次数

Spring数据MongoDb:MappingMongoConverter删除_class

默认的MappingMongoConverter将自定义类型键("_class")添加到数据库中的每个对象.所以,如果我创建一个Person:

package my.dto;
public class Person {
    String name;
    public Person(String name) {
        this.name = name; 
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其保存到db:

MongoOperations ops = new MongoTemplate(new Mongo(), "users");
ops.insert(new Person("Joe"));
Run Code Online (Sandbox Code Playgroud)

mongo中的结果对象将是:

{ "_id" : ObjectId("4e2ca049744e664eba9d1e11"), "_class" : "my.dto.Person", "name" : "Joe" }
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 将Person类移动到不同的命名空间有什么含义?

  2. 是否有可能不用"_class"键污染对象; 没有为Person类编写一个独特的转换器?

mongodb spring-data spring-data-mongodb

32
推荐指数
5
解决办法
2万
查看次数

MongoDB的Spring Data MongoDB和Hibernate OGM有什么区别?

我之前没有使用过Spring Data,但是我已经多次使用Hibernate ORM用于基于MySQL的应用程序.我只是不明白为基于MongoDB的应用程序在两者之间选择哪个框架.

我已经尝试寻找答案,但我找不到在生产环境中对两者进行比较的答案.有没有人发现使用MongoDB使用这两个框架有问题?

spring mongodb spring-data spring-data-mongodb hibernate-ogm

32
推荐指数
2
解决办法
8584
查看次数

MongoDB完整和部分文本搜索

ENV:

  • 使用MongoS的MongoDB(3.2.0)

采集:

  • 用户

文本索引创建:

  BasicDBObject keys = new BasicDBObject();
  keys.put("name","text");

  BasicDBObject options = new BasicDBObject();
  options.put("name", "userTextSearch");
  options.put("unique", Boolean.FALSE);
  options.put("background", Boolean.TRUE);

  userCollection.createIndex(keys, options); // using MongoTemplate
Run Code Online (Sandbox Code Playgroud)

文献:

  • { "名": "莱昂内尔"}

查询:

  • db.users.find( { "$text" : { "$search" : "LEONEL" } } ) =>找到了
  • db.users.find( { "$text" : { "$search" : "leonel" } } ) => FOUND(搜索caseSensitive为false)
  • db.users.find( { "$text" : { "$search" : "LEONÉL" } } ) => FOUND(使用diacriticSensitive搜索为false)
  • db.users.find( { "$text" : { "$search" : "LEONE" } } …

full-text-indexing mongodb mongodb-query aggregation-framework spring-data-mongodb

32
推荐指数
5
解决办法
3万
查看次数

MongoDB - 查询数组的最后一个元素?

我知道MongoDB支持语法find{array.0.field:"value"},但我特别想为数组中的最后一个元素执行此操作,这意味着我不知道索引.是否有某种操作员,或者我运气不好?

编辑:为了澄清,我希望find()只返回数组的最后一个元素中的字段与特定值匹配的文档.

arrays mongoose mongodb mongodb-query spring-data-mongodb

31
推荐指数
9
解决办法
3万
查看次数

如何在spring-boot中禁用spring-data-mongodb自动配置

有没有人尝试在spring-boot中禁用mongodb的自动配置?

我正在尝试使用spring-data-mongodb进行spring-boot; 使用基于java的配置; 使用spring-boot 1.2.1.RELEASE,我导入spring-boot-starter-web及其父pom进行依赖管理.我还导入了spring-data-mongodb(尝试过spring-boot-starter-mongodb).

我需要连接到两个不同的MongoDB服务器.所以我需要为mongo连接,MongoTemplate等配置两组实例.我还想禁用自动配置.由于我连接到多个服务器,因此我不需要自动配置单个默认的MongoTemplate和GridFsTemplate bean.

我的主要课程如下:

@Configuration
@EnableAutoConfiguration(exclude={MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
@ComponentScan
//@SpringBootApplication // @Configuration @EnableAutoConfiguration @ComponentScan 
public class MainRunner {

    public static void main(String[] args) {
        SpringApplication.run(MainRunner.class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我的两个mongo配置类看起来像这样:

@Configuration
@EnableMongoRepositories(basePackageClasses = {Test1Repository.class},
        mongoTemplateRef = "template1",
        includeFilters = {@ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*Test1Repository")}
)
public class Mongo1Config {

    @Bean
    public Mongo mongo1() throws UnknownHostException {
        return new Mongo("localhost", 27017);
    }

    @Primary
    @Bean
    public MongoDbFactory mongoDbFactory1() throws UnknownHostException {
        return new SimpleMongoDbFactory(mongo1(), "test1");
    }

    @Primary
    @Bean …
Run Code Online (Sandbox Code Playgroud)

java spring-data spring-data-mongodb spring-boot

28
推荐指数
4
解决办法
3万
查看次数

spring mongo数据存储库接口的"无效十六进制表示"

我有一个存储库接口,如下所示:

public interface ExcursionAttendeeRepository extends MongoRepository<ExcursionAttendee, String> {

    ExcursionAttendee findByWorkflowItemId(String workflowItemId);

    @Query("{ 'excursionEvent._id' : { '$oid' : ?0 } }")
    List<ExcursionAttendee> findByExcursionId(String excursionId);

    @Query("{ 'student._id' : {'$oid' : ?0} , 'excursionEvent._id' : { '$oid' : ?1 } }")
    ExcursionAttendee findByStudentIdAndEventId(String studentId, String excursionId);

    @Query("{ 'student._id' : { '$oid' : ?0 } }")
    List<ExcursionAttendee> findByStudentId(String studentId);
}
Run Code Online (Sandbox Code Playgroud)

而Bean创建spring则抛出异常.

Context initialization failed: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer#0.1':
  Cannot create inner bean '(inner bean)#5172829b' of type [org.springframework.amqp.rabbit.listener.adapter.MessageListenerAdapter] while setting bean property …
Run Code Online (Sandbox Code Playgroud)

mongodb spring-data spring-data-mongodb

28
推荐指数
1
解决办法
1197
查看次数

如何直接从Java中的mongodb查询返回原始JSON?

我有以下代码:

@RequestMapping(value = "/envinfo", method = RequestMethod.GET)
@ResponseBody
public Map getEnvInfo()
{
    BasicQuery basicQuery = new BasicQuery("{_id:'51a29f6413dc992c24e0283e'}", "{'envinfo':1, '_id': false }");
    Map envinfo= mongoTemplate.findOne(basicQuery, Map.class, "jvmInfo");
    return envinfo;
}
Run Code Online (Sandbox Code Playgroud)

你可以注意到,代码:

  1. 从MongoDB中检索JSON
  2. 将其转换为Map对象
  3. Map然后,Spring MongoData 将对象转换为JSON,然后返回到浏览器.

是否可以直接从MongoDb返回原始json而无需经过中间转换步骤?

java spring mongodb spring-data spring-data-mongodb

26
推荐指数
2
解决办法
3万
查看次数

如何防止从我的MongoRepository导出某些HTTP方法?

我正在使用spring-data-rest,我有一个像这样的MongoRepository:

@RepositoryRestResource
interface MyEntityRepository extends MongoRepository<MyEntity, String> {
}
Run Code Online (Sandbox Code Playgroud)

我想允许GET方法,但禁用PUT,POST,PATCH和DELETE(只读Web服务).

根据http://docs.spring.io/spring-data/rest/docs/2.2.2.RELEASE/reference/html/#repository-resources.collection-resource,我应该能够这样做:

@RepositoryRestResource
interface MyEntityRepository extends MongoRepository<MyEntity, String> {

    @Override
    @RestResource(exported = false)
    public MyEntity save(MyEntity s);

    @Override
    @RestResource(exported = false)
    public void delete(String id);

    @Override
    @RestResource(exported = false)
    public void delete(MyEntity t);
}
Run Code Online (Sandbox Code Playgroud)

它似乎不起作用,因为我仍然可以执行PUT,POST,PATCH和DELETE请求.

spring spring-data spring-data-rest spring-data-mongodb

25
推荐指数
2
解决办法
8646
查看次数