首页 > mongodb数据结构设计及多维数组嵌套文档的查询

mongodb数据结构设计及多维数组嵌套文档的查询

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
                }
            ]
        }
    ]
}

这个结构不太合理,内嵌数组太多,你提到的查询是可以搞的,但比较复杂,得灵活使用$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);
然后你依次获取来比,[]是数组,里面存多个对象.{}中存放的是对象。

【热门文章】
【热门文章】