前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mongo的morphia读取Map<String>>类型数据的问题「建议收藏」

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

作者头像
全栈程序员站长
发布2022-07-05 13:59:26
4380
发布2022-07-05 13:59:26
举报
文章被收录于专栏:全栈程序员必看

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

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

1.Entity数据结构:

代码语言:javascript
复制
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数据库中的存储格式:

代码语言:javascript
复制
{
 "_id" : ObjectId("5940b1643db71d944c800445"),
 "name" : "myEntity name test",
 "description" : "myEntity description test",
 "MapEntity" : {
        "entity1" : [
            {
                "name" : "lance",
				"description":"lance-description"
            }
        ],
		"entity2" : []
    }
	
}

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

代码语言:javascript
复制
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. 读取结果:

代码语言:javascript
复制
{
 "_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为

代码语言:javascript
复制
"entity2" : [
	    {
                "name" : "lance",
		 "description":"lance-description"
            }
	 ]

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

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

6.解决方式:

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Entity数据结构:
  • 2.数据在mongo数据库中的存储格式:
  • 3.读取数据库中数据的代码:
  • 4. 读取结果:
  • 5.结果分析:
  • 6.解决方式:
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档