为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

三国纷争 2019-03-20 14:15:31
1.以下Mongodb结构是否合理? 注: 其中messageId是另一个消息集合的_id,数值请无视2.如何查询出userId:FFFFFF,eventId:FFFFFF_18898981,messageStatus:1的messageId3.如何删除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                }            ]        }    ]}
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

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


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


{

    "userId":FFFFFF

    "eventId:FFFFFF_18898981

    "messageId":1,

    "messageStatus":1,

    "outTime":3000

},

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


查看完整回答
反对 回复 2019-04-23
?
烙印99

TA贡献1829条经验 获得超13个赞

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

查看完整回答
反对 回复 2019-04-23
  • 2 回答
  • 0 关注
  • 792 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号