簡體   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