【问题标题】:How to structure JSON data in mongoDB?如何在 mongoDB 中构造 JSON 数据?
【发布时间】:2017-06-04 00:43:15
【问题描述】:

我正在抓取一个新闻报纸网站。

该站点包含文章,其中包含标题、一些文本、时间戳、作者和评论部分。

评论部分包含来自不同注册用户的 cmets,他们可以在此处评论文章、为 cmets 点赞和回复其他 cmets。

我正在使用 MongoDB(初学者),我的问题是 JSON 对象中将保留什么。

例如,每篇新闻文章是否都是一个对象,其中包含所有用户 cmets。或者将每个文本/评论作为一个自己的对象是否更具可读性。

{"article": {
"id": "title of article",
"text": "text of article",
"author": "author of article",
"date": "date",
"comment_section": {
    "user": "username",
    "text": "text from comment",
    "upvotes": int,
},
}}

或者类似的东西:

{"text": {
    "text_type": "article text or comment",
    "text": "text of article or comment",
    "date": "date",
    "author": "author of article or comment author",
    "upvotes": int,
}}

第一个示例包含较少的对象,但其中包含很多内容,而后者包含很多对象,但其中包含的数据不多。

谢谢。

【问题讨论】:

    标签: json mongodb database-design


    【解决方案1】:

    json 的全部力量在于它是一棵树,因此单个文档可以包含其中的所有数据。您可以在子文档和投影上添加索引,以仅查询文档的必要部分。

    但是,如果您希望有巨大的 cmets 部分,则嵌入的 cmets 可能会成为问题,因为 mongodb 必须读取整个文档,在评论列表中添加新评论,然后将其写回。

    理想情况下,您会选择一个中间解决方案:保持 cmets 嵌入,直到少于 20-50(它们也与文章和“下一个 cmets”按钮一起呈现),然后切换以保持传入提取的 cmets 集合中的 cmets。这样,您可以使用单个 mongo 查询来呈现您的文章,有效地为每个用户交互生成一个 mongo 查询 - 这是 DB 设计的首选方式。

    使用 mongo,您将始终必须在对象大小 + 更新量与将数据提取到外部集合并对其执行额外查询的成本之间进行权衡。

    【讨论】:

    • 据我了解,您建议第一个选项,您是否还建议将所有不同的新闻文章也存储在同一个对象中?
    • 根据我的经验,我建议收集文章,并存储前 N 个 cmets,无论如何您都计划在页面渲染中显示它们,也在那里。因此,为了呈现文章页面,您可以在单个 mongo 查询中获取所有数据。当您有超过 N 个 cmets 时,请将多余的 cmets 放入单独的集合中,因为它很容易在一篇文章中增长到数千个 cmets,这会使文章的文档成本过高而无法阅读或修改。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多