蒙戈数据集合属性中存在点号(.)的解决方法

  

  

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本不支持点号,插入会报错

  

,当然最好不要发生属性中有点号的情况。

  

  

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。

蒙戈数据集合属性中存在点号(.)的解决方法