我需要编写一个应用程序,我可以使用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?两者是否同样成熟,或者其中一个缺少比另一个更多的功能?
我在验证用户时遇到以下错误:purchase_user @ purchase failed.MongoDB-CR身份验证失败.我通过浏览器访问webservice时缺少用户文档中的凭据.
但我可以从mongo验证purchase_user,它返回1.
默认的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)
问题:
将Person类移动到不同的命名空间有什么含义?
是否有可能不用"_class"键污染对象; 没有为Person类编写一个独特的转换器?
我之前没有使用过Spring Data,但是我已经多次使用Hibernate ORM用于基于MySQL的应用程序.我只是不明白为基于MongoDB的应用程序在两者之间选择哪个框架.
我已经尝试寻找答案,但我找不到在生产环境中对两者进行比较的答案.有没有人发现使用MongoDB使用这两个框架有问题?
spring mongodb spring-data spring-data-mongodb hibernate-ogm
ENV:
采集:
文本索引创建:
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
我知道MongoDB支持语法find{array.0.field:"value"},但我特别想为数组中的最后一个元素执行此操作,这意味着我不知道索引.是否有某种操作员,或者我运气不好?
编辑:为了澄清,我希望find()只返回数组的最后一个元素中的字段与特定值匹配的文档.
有没有人尝试在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) 我有一个存储库接口,如下所示:
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) 我有以下代码:
@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)
你可以注意到,代码:
Map对象Map然后,Spring MongoData 将对象转换为JSON,然后返回到浏览器.是否可以直接从MongoDb返回原始json而无需经过中间转换步骤?
我正在使用spring-data-rest,我有一个像这样的MongoRepository:
@RepositoryRestResource
interface MyEntityRepository extends MongoRepository<MyEntity, String> {
}
Run Code Online (Sandbox Code Playgroud)
我想允许GET方法,但禁用PUT,POST,PATCH和DELETE(只读Web服务).
@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请求.