вложенные схемы мангуста для множества массивов объектов - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь создать API для отдыха с помощью узла, экспресса и mongodb для веб-приложения, где у меня есть три маршрута или раздел на веб-интерфейсе

  1. Цитаты
  2. Истории
  3. Новости

Когда пользователь нажимает Цитаты, он видит только цитаты, то же самое касается историй и новостей.

Я запутался, как построить схему для такого рода 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' }
        ]
     }
  ]

Я надеюсь, что все ясно.будет так любезно с вашей стороны, если вы поможете мне.

1 Ответ

0 голосов
/ 22 февраля 2019

Я думаю, что вы на правильном пути, но вместо этого вы должны использовать ссылки.

(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

...