用于多个对象数组的猫鼬嵌套模式

Posted

技术标签:

【中文标题】用于多个对象数组的猫鼬嵌套模式【英文标题】:mongoose nested schemas for multiple array of objects 【发布时间】:2019-07-16 19:25:09 【问题描述】:

我正在尝试为 webapp 构建一个带有 node、express 和 mongodb 的 rest api,其中我在前端有三个路由或部分

    行情 故事 新闻

当用户点击引用时,他只会看到引用,故事和新闻也是如此。

我很困惑如何为这种 API 构建架构。

这是我的方法 首先,我为每个部分构建单独的模式,然后将它们全部合并到主 ApiSchema 中......我不确定这种方法是否正确

  const mongoose = require('mongoose')
  const Schema = mongoose.Schema

  const QuotesSchema = new Schema(
     author: 
        type: String,
        required: true
     ,
     categories: 
        type: [String],
        required: true
     
  )

  module.exports = Quotes = mongoose.model('quotes', QuotesSchema)

  const StoriesSchema = new Schema(
     title: 
        type: String,
        required: true
     ,
     description: 
        type: String,
        required: true
     
  )

  module.exports = Stories = mongoose.model('stories', StoriesSchema)

  const NewsSchema = new Schema(
     headline: 
        type: String,
        required: true
     
     date: 
        type: Date,
        default: Date.now
     
  )

 module.exports = News = mongoose.model('news', NewsSchema)

 const Quotes = require('./Quotes')
 const Stories = require('./Stories')
 const News = require('./News')

 const ApiSchema = new Schema(
     quotes: [Quotes],
     Stories: [Stories],
     News: [News]
  )


  module.exports = Api = mongoose.model('api', ApiSchema)

我想要我的 api,如下例所示

  [
     
        quotes: [
            author: 'John', quote: 'be happy', tags: ['life', 'heart'] ,
            author: 'Mark', quote: 'be creative', tags: ['motivation', 'education'] 
        ]
     ,
     
        story: [
            title: 'broken heart', description: 'sit ae Ipsa, laboriosam!', category: ['lorem1', 'lorem2'] ,
            title: 'lorem ipsum', description: 'Lorem ipsum dolor sit.', category: ['lorem1', 'lorem2'] 
        ]
     ,
     
        news: [
            headline: 'ipsum Lorem', city: 'Jehigi' ,
            headline: 'Lorem, ipsum', city: 'Fahmori' 
        ]
     
  ]

我希望我很清楚。如果你能帮助我,你会非常好心的。

【问题讨论】:

你的想法不清楚,你能告诉你为什么将其他模式引用到 API Schema 因为我想把所有的 api 数据放在一个地方 您打算如何使用 ApiSchema?为了什么? 这些架构是否链接到任何用户或其他东西 以对象数组的形式获取所有模式的数据...当转到 /api 时将获得整个 api...通过访问 api/quotes 将只获得引号...等等所以对于 【参考方案1】:

我认为你在正确的轨道上,但你应该改用引用。

(1) 拥有四个独立的模型和四个独立的架构是个好主意,但我会确保将它们分成单独的文件。

(2) 在您的 APISchema 中,您可以引用其他每个架构,如下所示:

const ApiSchema = new Schema(
  quotes: [ type: mongoose.Schema.Types.ObjectId,, ref: 'quotes' ]
  stories: [ type: mongoose.Schema.Types.ObjectId,, ref: 'stories' ],
  news: [ type: mongoose.Schema.Types.ObjectId,, ref: 'news' ]
);

(3) 现在,当您创建 API 文档时,您必须手头有引述、故事和新闻的 _id。如果你这样做了,从那里开始很简单

const quotes = []; // Array of quote _ids
const stories = []; // Array of story _ids
const news = []; // Array of news _ids

const apiObject = 
  quotes: quotes,
  stories: stories,
  news: news
;

// Save the API Object to the database
apiObject.save()
.then((savedObject) => 
  // Here is your saved object. Database should be accurate.
);

这样做的好处是人口。当您从数据库中查找 API 文档时,您可以填充每个字段并返回整个对象

API.find().populate('quotes stories news')
.then((apiObjects) => 
// Populated documents
);

此外,当您想要/需要更新报价时,通过其自己的模型更新报价要简单得多,调用 Quote.update(),而不是尝试通过 API 模型更新它

【讨论】:

这似乎有帮助...感谢您的回答...是时候测试路线了。

以上是关于用于多个对象数组的猫鼬嵌套模式的主要内容,如果未能解决你的问题,请参考以下文章

嵌套模式/子文档对象中的猫鼬 findById() - 聚合

更新混合类型的猫鼬嵌套数组

使用没有数组的嵌套文档为我的 JSON 定义有效的猫鼬模式?

如何将对象响应对象的猫鼬聚合数组转换为json对象响应

带有嵌套可选对象的猫鼬模式

带有嵌套可选对象和必填字段的猫鼬模式