MongoDB是面向集合存储的文档型数据库,其涉及到的基本概念与关系型数据库比有所不同。本文主要介绍关于mongo数据集合属性存在点号(.)的相关内容、下面话不多说了,来一起看看详细的介绍吧
1。似乎mongo3.6之前不允许插入带点(.)或美元符号(美元)的键,但是当我使用mongoimport工具导入包含点的JSON文件时,它工作正常。
2。在使用spring-data-mongodb处理mongodb的增删改查时会通过一个MappingMongoConverter(文档和新型转换类)转换数据
3。具体对点号的转换在DBObjectAccessor (spring-data-mongodb-1.10.13)或者DocumentAccessor (spring-data-mongodb-2.0.9),如下:
//插入时转换 公共空间把(MongoPersistentProperty道具、对象价值){ 断言。notNull(道具,“MongoPersistentProperty不得空!”); 字符串字段名=prop.getFieldName (); 如果(! fieldName.contains (“。”)) { dbObject。把(字段名、价值); 返回; } Iterator部分=arrays . aslist (fieldName.split (“\ \”。)) .iterator (); DBObject DBObject=this.dbObject; 而(parts.hasNext ()) { 字符串部分=parts.next (); 如果(parts.hasNext ()) { dbObject dbObject=getOrCreateNestedDbObject(部分); 其他}{ dbObject。(部分价值); } } }//查询时转换 公共对象(MongoPersistentProperty属性){ 字符串字段名=property.getFieldName (); 如果(! fieldName.contains (“。”)) { 返回this.dbObject.get(字段名); } Iterator 部分=arrays . aslist (fieldName.split (“\ \”。)) .iterator (); Object> Map<字符串;源=this.dbObject; 对象的结果=零; 而(源!=零,,parts.hasNext ()) { 结果=source.get (parts.next ()); 如果(parts.hasNext ()) { 源=getAsMap(结果); } } 返回结果; }//判断值是否为空 公共布尔hasValue (MongoPersistentProperty财产){ 断言。notNull(财产,“财产不得空!”); 字符串字段名=property.getFieldName (); 如果(! fieldName.contains (“。”)) { 返回this.dbObject.containsField(字段名); } String []=fieldName.split部分(“\ \”。); Object> Map<字符串;源=this.dbObject; 对象的结果=零; for (int i=1;我& lt;parts.length;我+ +){ 结果=来源。[i - 1] get(部分); 源=getAsMap(结果); 如果(源==null) { 返回错误; } } 返回source.containsKey(部分(部分。长度- 1]); }
4。点号在mongodb中有子集合的含义
例如查询A.B属性:查询的是集合中一个对应子集合中的属性B的值,并不是查询集合中。B的属性
问题描述:文档在数据库中的样子:
{ " _id ": ObjectId (" 5 bae00765500af6307755111 "), “名称”:“java”, 年龄:26岁 ”一个。B:“nnnn” }
因此在模型中使用@Field (A.B)查询不出集合中”的。B”的值
@Field (“A.B”) @JSONField (serialzeFeatures=SerializerFeature.DisableCircularReferenceDetect) 私人整数ab;>之前<强> 5。解决方法:强>
查阅多方资料有以下几点体会:点号在MongoDB中可以插入应该开始于3.6版,本官方文档虽然说可以支持点号,但是第三方驱动,spring-data-mongodb并没有支持,但是因为一开始项目已经使用了spring-data-mongodb难以替换,所以就想到覆盖转换方法。
怎么覆盖spring-data-mongodb包中的文件?
新建一个和DBObjectAccessor转换文件一样的目录,重新建DBObjectAccessor类复制代码自定义修改,编译之后或优先使用新建的类。
//查询时转换 公共对象(MongoPersistentProperty属性){ 字符串字段名=property.getFieldName (); 返回this.dbObject.get(字段名); }//判断值是否为空 公共布尔hasValue (MongoPersistentProperty财产){ 断言。notNull(财产,“财产不得空!”); 字符串字段名=property.getFieldName (); 返回this.dbObject.containsField(字段名); }尽量不要修改把方法,应为低版本的MongoDB本不支持点号,插入会报错
,当然最好不要发生属性中有点号的情况。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
蒙戈数据集合属性中存在点号(.)的解决方法