如何在Spring Data MongoDB 中保存和查询动态字段
MongoDB 的一大特点就是所有的记录都是文档形式,无所谓数据库字段,每一条数据都是独立的。在使用Spring Data MongoDB 时,如果直接用关系型数据库的用法去套,那会发现很难发挥MongoDB的特性。
我在搜索如何解决问题的时候,发现了一篇问答正好能解决我的问题,所以我用自己浅薄的英语做个简单的翻译。
这是一篇 Stack Overflow 上的问答
有人提了个问题,在使用 Spring Boot 1.4.x 和 Spring Data MongoDB 时,想要动态存储实体的字段,而不是直接用一个已经定义好的实体的固定字段存储。
虽然可以在实体类内部创建一个Map属性来存动态字段,但提问者想要的是所有的字段都处于MongoDB文档的顶层,不想要在字段里面还存在额外的数据结构。
提问者尝试后发现,直接将实体类继承自HashMap是不行的
Error creating bean with name 'entryRepository': Invocation of init method failed; nested exception is org.springframework.data.mapping.model.MappingException: Could not lookup mapping metadata for domain class java.util.HashMap!
问题的优质回答:
先讲结论:
- 不能直接使用或者继承java集合类作为实体类
- Spring Data MongoDB 的 Repositories 不能实现上面的需求
- 使用 DBObject 类配合 MongoTemplate 才能实现
分析;
Spring Data Repositories 是MongoDB用在设计好的数据结构中的持久层,为了配合面向对象设计使用。Spring Data 在分析检查类的时候,会将集合和Map类型的类剔除出去。
Repository 的查询方法虽然也可以实现动态字段查询,但不是主流的用法。
public interface EntryRepository extends MongoRepository<Entry, String> {
@Query("{ ?0 : ?1 }")
Entry findByDynamicField(String field, Object value);
}
这个方法不提供任何类型安全检查,只是简陋地为字段提供一个别名。
最好使用 DBObject 配合 MongoTemplate 的Query方法使用。
List<DBObject> result = template.find(new Query(Criteria.where("your_dynamic_field").is(theQueryValue)), DBObject.class);
DBObject 能在不定义数据结构的情况下,直接映射MongoDB文档的结果。可以直接使用 DBObject 类结合 MongoTemplate 进行增删改查的操作。
我个人的尝试
应该是 Spring Data MongoDB 相关团队了解到了这个需求,目前的spring-data-mongodb 3.1.6 版本中,MongoTemplate 类的insert和save方法都可以直接操作Map数据,甚至对于任意实体类都能随意操作,只要指定 collection 名称就行。
HashMap object = new HashMap();
object.put("file_name", "object");
object.put("md5", "1827391");
HashMap aa = template.save(object, "file");
Student student = new Student("小明", "希望小学");
Student bb = template.save(student, "file");
以上代码均能正常执行,数据能准确存入数据库。
如何在Spring Data MongoDB 中保存和查询动态字段的更多相关文章
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- 如何在Spring Data JPA中引入Querydsl
一.环境说明 基础框架采用Spring Boot.Spring Data JPA.Hibernate.在动态查询中,有一种方式是采用Querydsl的方式. 二.具体配置 1.在pom.xml中,引入 ...
- Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名
要在Spring data mongodb 中使用@CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy 这四个注解 必须实现 SpringSecuri ...
- spring data mongodb 配置遇到的几个问题
一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
一.简单介绍 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...
- Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)
一.简介 Spring Data MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery
一.简介 spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...
- Spring Data MongoDB 五:进阶文档查询(分页、Morphia)(二)
Spring Data MongoDB 三:基本文档查询(Query.BasicQuery)(一) 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) 一.简单介绍 Spring ...
随机推荐
- <jsp:param>传递参数,出现乱码问题
今天在学习<jsp:forward>和<jsp:param>时,用<jsp:param>传递参数时,出现乱码问题,部分代码如下: 1 <jsp:forward ...
- FastTunnel-开源内网穿透框架
FastTunnel - 打造人人都能搭建的内网穿透工具 FastTunnel是用.net core开发的一款跨平台内网穿透工具,它可以实现将内网服务暴露到公网供自己或任何人访问. 与其他穿透工具不同 ...
- 「AGC023D」 Go Home
「AGC023D」 Go Home 传送门 神题. 首先我们可以倒着考虑. 当车到达最后一栋楼的时候,车上一定只有到这栋楼的员工. 当车到达倒数第二栋楼的时候,车上一定只有到达剩下两栋楼的员工. 设这 ...
- C语言:进制转化
16进制数4321转10进制:原来方法 =4*16^3+3*16^2+2*16^1+1*16^0 =4*16^3+3*16^2+2*16^1+1 =16*(4*16^2+3*16^1+2)+1 =16 ...
- XP共享打印机
1.开启GUEST:右击"我的电脑"管理--用户--GUEST开启 2.运行--GPEDIT.MSC--计算机管理-WINDOWS设置--安全设置--本地策略--用户权利指派--允 ...
- Java之注解与反射
Java之注解与反射 注解(Annotation)简介 注解(Annotation)是从JDK5.0引入的新技术 Annotation作用:注解(Annotation)可以被其他程序如编译器等读取 A ...
- SLAM的数学基础(2):协方差和协方差矩阵
之前我们知道,方差是一组数据的离散程度,它的公式为: 那么如果我们有几组数据,需要知道这几组数据的协同性呢? 举个例子,还是在小红,几次考试成绩如下: 入学考试:数学:80,语文:80 期中考试:数学 ...
- ORM研究3 - odoo fields常用的字段属性
之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...
- SpringBoot通过Ajax批量将excel中数据导入数据库
Spring Boot通过Ajax上传Excel并将数据批量读取到数据库中 适合场景:需要通过excel表格批量向数据库中导入信息 操作流程 [1]前端上传一个excel表格 [2] 后端接收这个ex ...
- 微信小程序云开发-云存储的应用-识别身份证(正面和反面)
一.准备工作 1.创建云函数identify 2.云函数identify中index.js代码 1 // 云函数入口文件 2 const cloud = require('wx-server-sdk' ...