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

                }

            ]

        }

    ]

}


三国纷争
浏览 793回答 2
2回答

萧十郎

这个结构不太合理,内嵌数组太多,你提到的查询是可以搞的,但比较复杂,得灵活使用$unwind用nosql,个人的建议是可以适当冗余,然后数据结构尽量平坦,这样查询效率较高,如果是我设计,就采用下面很平坦的做法:{    "userId":FFFFFF    "eventId:FFFFFF_18898981    "messageId":1,    "messageStatus":1,    "outTime":3000},虽然冗余了userId和eventId在多条记录里,但是查询和索引都很好能,等于以空间换时间。适合放数组里面的最好是很简单的结构,诸如标签这种纯字符串数组

烙印99

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

相关分类

Java