V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
anthoy
V2EX  ›  Java

spring mongdb 查询问题

  •  
  •   anthoy · 2021-05-19 15:45:45 +08:00 · 1757 次点击
    这是一个创建于 1302 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在使用 spring-data-mongodb 在 spring boot 中处理数据库

    数据库内容如下:

    { 
    "_id" : "b8261207-3f95-40ca-bd05-e06ad451dff8",
    "updateDate" : ISODate("2021-05-18T09:17:28.409Z"), 
    "isDelete" : false,
     "name" : "test",
     "receivedDate" : ISODate("2021-05-15T09:38:52Z"),
     "deviceId" : "55118b35-43d3-4700-b8be-41daefb7f502",
     "createDate" : ISODate("2021-05-18T09:17:28.409Z") 
    }
    { 
    "_id" : "b8261207-3f95-40ca-bd05-e06ad451dff8",
    "updateDate" : ISODate("2021-05-18T09:17:28.409Z"), 
    "isDelete" : false,
     "test" : "test",
     "createDate" : ISODate("2021-05-18T09:17:28.409Z") 
    }
    

    然后我写的 repository 查询代码如下:

        public List<HashMap> findAll() {
            return mongoTemplate.findAll(HashMap.class, Constant.collectionName);
        }
    

    我有两个问题想问下:

    • 因为数据库储存的 json 格式和内容是不固定的,所以我没有使用 entity 来处理实体类,而是使用 HashMap<String, Object>来处理的,目前在查询的时候使用 HashMap 进行查询结果储存

    对于这个方案,大家有不同的建议嘛?使用 HashMap 有个问题是转不了 HashMap<String, Object>,这个转换只能遍历转换?

    我也尝试使用 DBObject 替代 HashMap 进行使用,这两个那个比较好呢?或者有没有其他的方案

    • 第二个问题是无论我使用到的是 HashMap 或者 DBObject,查询出来的结果都是下面的
    [
        {
            "updateDate": 1621329448409,
            "isDelete": false,
            "name": "test",
            "_id": "b8261207-3f95-40ca-bd05-e06ad451dff8",
            "receivedDate": 1621071532000,
            "deviceId": "55118b35-43d3-4700-b8be-41daefb7f502",
            "createDate": 1621329448409
        }
    ]
    

    这个时间在 mongodb 中是 ISODate,但是查询出来由于没有使用具体的类型导致了没有自动转换格式,我希望查询出来的格式是"yyyy-MM-dd HH:mm:ss"的

    这个可以有什么办法自动实现嘛?使用遍历手动转感觉不太友好

    • 资料

    Storing a JSON schema in mongodb with spring

    如何在 Spring Data MongoDB 中保存和查询动态字段

    8 条回复    2021-05-21 11:00:48 +08:00
    chendy
        1
    chendy  
       2021-05-19 19:40:28 +08:00
    既然选择了哈希迈普
    就自己慢慢转吧
    tubimasky
        2
    tubimasky  
       2021-05-19 20:40:19 +08:00
    fastjson
    JSON.parse(JSON.toJSONStringWithDateFormat(o, "yyyy-MM-dd HH:mm:ss"))
    oneisall8955
        3
    oneisall8955  
       2021-05-19 22:00:49 +08:00 via Android
    为什么不是固定的格式呢?存数据不是先编写实体先吗?
    用 JsonObect 来搞?
    clf
        4
    clf  
       2021-05-20 11:21:53 +08:00
    一般都是先建实体的。要灵活也是继承于某个抽象类,并实现指定的转换方法。
    anthoy
        5
    anthoy  
    OP
       2021-05-21 10:32:29 +08:00
    @oneisall8955 @lychs1998 因为数据结构变化很大,没有办法用一个实体处理,实体的参数一直在变,建实体的话要建太多了
    clf
        6
    clf  
       2021-05-21 10:42:51 +08:00
    @anthoy 无论变化多么大,只要它需要用于业务数据,理论上就应该拆分成一个个实体类。如果说真的存在参数名灵活,那么是不是缺少了一个参数名的配置表 /字段?
    anthoy
        7
    anthoy  
    OP
       2021-05-21 10:53:48 +08:00
    @lychs1998 是有一个配置表,我也认可理论上是要弄成实体类的,但实际上使用时确实不能这样子,数据变动太多,而且考虑以后的数据未知,创建实体类给之后的使用导致需要一次次的重新创建,感觉很不友好,目前我是用 DBObject 处理,感觉配置表读取需要的数据
    clf
        8
    clf  
       2021-05-21 11:00:48 +08:00
    @anthoy 所以我之前提到过继承于某个抽象类,后续灵活的数据也要按照一定的约定,在这个基础上做更多的拓展。“数据未知”证明了你们在设计业务数据结构的阶段就存在问题了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5514 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 01:57 · PVG 09:57 · LAX 17:57 · JFK 20:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.