用于多个对象数组的猫鼬嵌套模式
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() - 聚合