Mongo的morphia读取Map<String>>类型数据的问题「建议收藏」

Mongo的morphia读取Map<String>>类型数据的问题「建议收藏」      最近一直使用morphia,给mongo数据查询带来很多遍历,但是最近项目遇到了一个严重的问题,在从Mongo数据库中查询Map&lt;String, List&lt;Object&gt;&gt;字段时,针对value值为空list时(即[ ]),竟然读到数据的严重问题,具体描述如下: 1.Entity数据结构:      import org.mongodb.morph…

大家好,又见面了,我是你们的朋友全栈君。

      最近一直使用morphia,给mongo数据查询带来很多遍历,但是最近项目遇到了一个严重的问题,在从Mongo数据库中查询Map<String, List<Object>>字段时,针对value值为空list时(即[ ]),竟然读到数据的严重问题,具体描述如下:

 1.Entity数据结构:     

 

import org.mongodb.morphia.annotations.Embedded;
import org.mongodb.morphia.annotations.Property;

import java.util.List;
import java.util.Map;

/**
 * Created by lance on 2017/6/14.
 */
public class MyEntity {

    @Property("id")
    private String id;
    @Property("name")
    private String name;
    @Property("description")
    private String description;

    

    @Embedded
    private Map<String, List<SubEntity>> mySubEntity;

    public static class SubEntity {
        @Property("subName")
        private String subName;
        @Property("subDescription")
        private String subDescription;
    }
}

 

 

 

2.数据在mongo数据库中的存储格式:

 

{
 "_id" : ObjectId("5940b1643db71d944c800445"),
 "name" : "myEntity name test",
 "description" : "myEntity description test",
 "MapEntity" : {
        "entity1" : [
            {
                "name" : "lance",
				"description":"lance-description"
            }
        ],
		"entity2" : []
    }
	
}

 

 

 

3.读取数据库中数据的代码:

  

import org.bson.types.ObjectId;
import org.mongodb.morphia.Datastore;
import org.mongodb.morphia.query.Query;

/**
 * Created by lance  on 2017/6/14.
 */
public class MyEntityDao {

    private Datastore datastore;

    public MyEntity getMyEntityById(String Id) {
        Query<MyEntity> query = datastore.createQuery(MyEntity.class);
        query.criteria("_id").equal(new ObjectId(Id));
        return query.get();
    }
}

 

 

 

 4. 读取结果:

 

{
 "_id" : ObjectId("5940b1643db71d944c800445"),
 "name" : "myEntity name test",
 "description" : "myEntity description test",
 "MapEntity" : {
        "entity1" : [
            {
                "name" : "lance",
				"description":"lance-description"
            }
        ],
	"entity2" : [
	    {
                "name" : "lance",
		 "description":"lance-description"
            }
	 ]
    }
	
}

 

5.结果分析:

 

     5.1  数据库中保存的”entity2″ : 为空[ ] ,而使用morphia获取到的Entity为

 

"entity2" : [
	    {
                "name" : "lance",
		 "description":"lance-description"
            }
	 ]

 和entity1 相等,MyEntityDao获取的值错误,会给业务带来严重的问题。

 

    5.2  当”entity2″值不是[ ]时,能够获取到正确的结果。

 

  6.解决方式:

   将MyEntity数据保存到Mongo数据库中时,禁止Map<String, List<SubEntity>> mySubEntity的map中的key为[ ]的数据保存到数据库中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149548.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月17日 上午7:36
下一篇 2022年6月17日 上午7:46


相关推荐

  • compound extreme_EXTRASUPERTADARISE

    compound extreme_EXTRASUPERTADARISE
     
    安装要求
    1、Servlet2.3或更高
    2、JDK1.3.1或更高
    最小的Jars需求
    1、commons-beanutils1.6
    2、commons-collections3.0
    3、commons-lang2.0
    4、commons-logging1.0.4
    5、standard1.0.2
    PDF导出要用到的包:
    1、avalon-framew

    2022年8月20日
    8
  • c语言中uint8_uint16转uint8

    c语言中uint8_uint16转uint8C++的基础数据类型:名称字节长度取值范围bool1false,truechar1-128~127signedchar1-128~127unsignedchar10~255short(signedshort)2-215~215-1unsignedshort20~216-1int(signedin…

    2025年11月23日
    6
  • 运算放大器的差分放大电路_差分放大电路的应用

    运算放大器的差分放大电路_差分放大电路的应用

    2025年7月25日
    5
  • 数据仓库之ODS层设计概要

    数据仓库之ODS层设计概要ODS 层辨析 ODS 全称是 OperationalD 即操作数据存储 InmonVSKimba Inmon 的定义 ODS 是一个面向主题的 集成的 可变的 当前的细节数据集合 用于支持企业对于即时性的 操作性的 集成的全体信息的需求 常常被作为数据仓库的过渡 也是数据仓库项目的可选项之一 而 Kimball 的定义 操作型系统的集成 用于当前 历史以及其它细节查询 业务系统的一部分 为决策支持提供当前细节数据 数据仓库的一部分 ODSVSDBVSED

    2026年3月20日
    2
  • ucosii操作系统详解_curdate函数

    ucosii操作系统详解_curdate函数UCOSII的用法OSTaskCreate()函数原型:INT8UOSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INT8Uprio)调用者:任务或者是初始化代码。作用:建立一个新任务,任务的建立可以在多个任务环境启动之前,也可以在正在运行的任务中建立,中断处理程序中不能建立任务,一个任务必须为无限循环结构,且不能有…

    2025年9月8日
    5
  • pprint python_让我们来谈谈python中的prettyprint和pprint

    pprint python_让我们来谈谈python中的prettyprint和pprint当你开始学习 python 编程的时候 你做的第一件事是什么 相信我们都已经通过 HelloWorld 程序开始了我们的 python 之旅 在 python 中 它可以在一行中完成 print HelloWorld 但是 在使用 print 函数打印字典 列表或任何其他复杂数据类型时 您是否遇到过这种痛苦呢 由于不适当的缩进问题 我们经常在 python 嵌套数据结构的输出中遇到可读性方面的困难 让我们

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号