java - mongodb数据结构设计及多维数组嵌套文档的查询
ringa_lee
ringa_lee 2017-04-18 09:44:55
[Java讨论组]

1.以下Mongodb结构是否合理?
注: 其中messageId是另一个消息集合的_id,数值请无视
2.如何查询出userId:FFFFFF,eventId:FFFFFF_18898981,messageStatus:1的messageId
3.如何删除userId:FFFFFF,eventId:FFFFFF_18898981下所有messageStatus:1的消息

mongodb 结构如下:

{
    "_id": 略,
    "userId":FFFFFF,
    "events":[
        {
            "eventId":"FFFFFF_18898981"
            "messages":[
                {
                    "messageId":1,
                    "messageStatus":1,
                    "outTime":3000
                },
                {
                    "messageId":2,
                    "messageStatus":0,
                    "outTime":3000
                }
                {
                    "messageId":3,
                    "messageStatus":1,
                    "outTime":3000
                }
            ]
        }
        {
            "eventId":"FFFFFF_28898981"
            "messages":[
                {
                    "messageId":1,
                    "messageStatus":1,
                    "outTime":3000
                },
                {
                    "messageId":2,
                    "messageStatus":0,
                    "outTime":3000
                }
                {
                    "messageId":3,
                    "messageStatus":1,
                    "outTime":3000
                }
            ]
        }
    ]
}
ringa_lee
ringa_lee

ringa_lee

全部回复(2)
迷茫

这个结构不太合理,内嵌数组太多,你提到的查询是可以搞的,但比较复杂,得灵活使用$unwind

用nosql,个人的建议是可以适当冗余,然后数据结构尽量平坦,这样查询效率较高,如果是我设计,就采用下面很平坦的做法:

{
    "userId":FFFFFF
    "eventId:FFFFFF_18898981
    "messageId":1,
    "messageStatus":1,
    "outTime":3000
},

虽然冗余了userId和eventId在多条记录里,但是查询和索引都很好能,等于以空间换时间。适合放数组里面的最好是很简单的结构,诸如标签这种纯字符串数组

怪我咯

依次回答你的问题:
1.结构不合理。我们再构造JSON数据的时候,原则上不要嵌套多层,如果能嵌套多层的数据结构,其实是可以对java bean数据结构本身再进行抽象的,而且多层嵌套,在fastjson中。阿里巴巴的fastjson是不支持两层嵌套的,多层嵌套的获取数据要自己写方法来取值,非常不利于开发。
2.查询和删除都要取值判断,代码如下:
定义一个java bean 属性:String id, String userId List<Event> events;
Event events = (Event)JSON.toJavaObject(json, Event.class);
然后你依次获取来比,[]是数组,里面存多个对象.{}中存放的是对象。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号