繁体   English   中英

MongoDB 架构:如何以可扩展的方式存储大量数组或子文档

[英]MongoDB architecture: how to store a large amount of arrays or sub documents in a scalable way

我目前正在开发一个博客应用程序,用户可以在其中创建自己的博客,并且每个博客中都有博客文章。 当每个博客都有很多博客文章时,我正在考虑构建一个可扩展的数据库。

那么将我的数据库结构如下是否更好:

blog1 : {
 blogname : 'blog1',
 blogposts: [array of blogposts] 
},

blog2 : {
 blogname : 'blog2',
 blogposts: [array of blogposts] 
}

或者我应该为所有博客文章创建一个单独的集合,如下所示:

blogpost1: {
 id: 'blogpost1',
 content: {blogpost content in json format}
},
blogpost2: {
 id: 'blogpost2',
 content: {blogpost content in json format}
}

并在博客收藏中引用它们。

我想知道当有很多博客文章时,哪个选择会更好。 因为我记得在 MongoDB 文档中的某处读过,不建议在文档中包含可以超出界限的数组,所以方法 #1 并不理想,对吧?

在创建数据库时,我发现考虑我将提出的请求很有用。

博客应用程序用户想要搜索所有博客或根据某些条件查找博主。

在这种情况下,博主和博客的单独集合将最有效。 然后构建您的文档,以便博主链接到他们的博客,反之亦然。

这可以通过 Mongoose Schemas ( https://mongoosejs.com/docs/index.html ) 来完成。

// models/blogger.js
const mongoose = require('mongoose')

const bloggerSchema = mongoose.Schema({
  blogs: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Blog'
    }
  ],
  name: String
})

bloggerSchema.set('toJSON', {
  transform: (document, returnedObject) => {
    const blogger = returnedObject

    blogger.id = blogger._id.toString()
    delete blogger._id
    delete blogger.__v
  }
})

module.exports = mongoose.model('Blogger', bloggerSchema)

然后使用 populate 与您的请求:

// controllers/bloggers.js
const bloggersRouter = require('express').Router()
const Blogger = require('../models/blogger')

bloggersRouter.get('/', async (request, response) => {
  const bloggers = await Blogger.find({}).populate(
    'blogs', {
      title: 1
    }
  )
  response.json(bloggers.map(blogger => blogger.toJSON()))
})

module.exports = bloggersRouter

这样您就不必将博客完整地添加到博客文档中,您只需在博客的初始视图中包含标题或您需要的任何其他内容。

您还可以考虑限制博客的长度,以便您可以更好地控制数据,然后考虑 Joe 建议的选项。

为什么必须是其中之一?

将博客文章存储在与博客相同的文档中是很好的,只要单个文章不是很大,而且不是很多。

将帖子存储在单独的集合中适用于较大的帖子和繁忙的博客,但会增加额外的查询或查找以进行检索。

我认为您的用户输出的范围应该是从稀疏到多产,个别帖子的大小从几十字节到几兆字节不等。

对于不太活跃的博客上的小帖子,将帖子存储在博客文档中以便高效检索。

对于繁忙的博客,请将它们存储在存档集合中。 也许在博客文档中存储最近的几篇文章或最受欢迎的文章,这样您就不必每次都参考其他集合。

您还需要弄清楚如何在文档之间拆分帖子。 MongoDB 对单个文档有 16MB 的限制,因此如果您的任何用户发布了大量帖子,您将需要能够将它们存储在某个地方。

您所写的问题似乎是在询问遵循关系模型还是严格的文档模型更好。 我认为实际上这两种方法都不适合这种情况,混合和灵活的方法会更好。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM