• 导航

mongo数据集合属性中存在点号(.)

根本知识点:

1.好像mongo3.6之前不允许刺进带点或美元符号的键,可是当我运用mongoimport东西导入包括点的json文件时,它作业正常。

2.在运用spring-data-mongodb处理mongodb的增修正查时会经过一个mappingmongoconverter转化数据

3.详细对点号的转化在dbobjectaccessor或许documentaccessor,如下:

//刺进时转化
public void put {
 assert.notnull;
 string fieldname = prop.getfieldname;
 if ) {
 dbobject.put;
 return;
 iterator string parts = arrays.aslist).iterator;
 dbobject dbobject = this.dbobject;
 while ) {
 string part = parts.next;
 if ) {
 dbobject = getorcreatenesteddbobject;
 } else {
 dbobject.put;
//查询时转化
public object get {
 string fieldname = property.getfieldname;
 if ) {
 return this.dbobject.get;
 iterator string parts = arrays.aslist).iterator;
 map string, object source = this.dbobject;
 object result = null;
 while ) {
 result = source.get);
 if ) {
 source = getasmap;
 return result;
//判别值是否为空
public boolean hasvalue {
 assert.notnull;
 string fieldname = property.getfieldname;
 if ) {
 return this.dbobject.containsfield;
 string[] parts = fieldname.split;
 map string, object source = this.dbobject;
 object result = null;
 for  {
 result = source.get;
 source = getasmap;
 if  {
 return false;
 return source.containskey;
}

 

4.点号在mongodb中有子调集的意义

例如查询a.b特点:查询的是调集中a对应子调集中的特点b的值,并不是查询调集中a.b的特点

问题描绘:文档在数据库中的姿态:

{
 "_id": objectid,
 "name": "java",
 "age": 26,
 "a.b": "nnnn"

因此在model中运用@field查询不出调集中的"a.b"的值
@field
@jsonfield
private integer ab; 

5.解决办法:

查阅多方材料有以下几点领会:点号在mongodb中能够刺进应该开始于3.6版别,官方文档尽管说能够支撑点号,可是第三方驱动、spring-data-mongodb并没有支撑,可是由于一开始项目现已运用了spring-data-mongodb难以替换,所以就想到掩盖转化办法。

怎样掩盖spring-data-mongodb包中的文件?

新建一个和dbobjectaccessor转化文件相同的目录,重新建dbobjectaccessor类仿制代码自定义修正,编译之后或优先运用新建的类。

//查询时转化
public object get {
 string fieldname = property.getfieldname;
 return this.dbobject.get;
//判别值是否为空
public boolean hasvalue {
 assert.notnull;
 string fieldname = property.getfieldname;
 return this.dbobject.containsfield;
} 

 

 留意:尽量不要修正put办法,应为低版别的mongodb本不支撑点号,刺进会报错 

 当然最好不要发作特点中有点号的状况。