Как добавить новую коллекцию из существующей коллекции - PullRequest
0 голосов
/ 12 апреля 2019

Итак, я создаю музыкальный проигрыватель и хотел бы создать схему альбома из схемы песни (уже создана).

В схеме альбома есть название альбома и массив песен. Теперь я хотел бы добавить песни в альбом, если они имеют одинаковое название.

Как мне этого добиться?

Я отсортировал коллекцию песен по названию альбома, но понятия не имею, как добавить песни в массив песен, если они имеют одинаковое название альбома.

//This is the song Schema.
var Song = mongoose.model('Songs', {
    album: String,
    title: String,
    artist: String,
    genre: String,
    year: Number,
    src: String
});

//This is the Album Schema.
const AlbumSchema = new Schema({
    album: String,
    songs: [{
        title: String,
        artist: String,
        genre: String,
        year: Number,
        src: String
    }]
});

Также есть ли способ вложить схему Songs в схему Album?

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019
//Blank Array which stores AlbumSchemaObject
let AlbumSchemaArray = [];
//sample Object
let albumObj = {album:"abc",songs:[{title:"abc",artist:"abc",genre:"abc",year:"abc",src:"abc"}]}
//Data from Database
let dataFromMongo = someAlbumObj
//search in already stored Array Object
//if album names exists then fetch that Object
var searchedAlbumObj = AlbumSchemaArray.find((singleObj) => {
                return singleObj.album  === dataFromMongo.album;
            });
//If object match then push songs in that objet
if(typeof(searchedAlbumObj.album) != "undefined")
{
    searchedAlbumObj['songs'].push(dataFromMongo.songs)
}
else //creates new object and stores
{
    AlbumSchemaArray.push(dataFromMongo)
}

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

0 голосов
/ 12 апреля 2019

Если у вас уже есть коллекция песен, и вам нужно найти песни определенного альбома, вы можете использовать это:

Song.find({album: 'foo'})
  .exec()
  .then(songs => {
    return Album.findOneAndUpdate({album: 'foo'}, {$push: {songs: songs}})
      .exec()
  })
  .then(album => console.log(album))
  .catch(err => err);

Ваша схема альбома должна выглядеть следующим образом:

const AlbumSchema = new mongoose.Schema({
  album: String,
  songs: [songSchema]
});
const Song = mongoose.model('Song', songSchema);

Пример :

songs : [ { _id: 5cb05ecd0facc60f8e383259, album: 'foo', title: 'song1' },
  { _id: 5cb05ecd0facc60f8e38325a, album: 'bar', title: 'song2' },
  { _id: 5cb05ecd0facc60f8e38325b, album: 'foo', title: 'song3' } ]

Song.find({album: 'foo'})
  .exec()
  .then(songs => {
    return Album.findOneAndUpdate({album: 'foo'}, {$push: {songs: songs}})
      .exec()
  })
  .then(album => console.log(album))
  .catch(err => err);

// Code above gives you :

{ _id: 5cb05f8ee567df1092be74a9,
  songs: 
   [ { _id: 5cb05ee5f1a14c0fc23f0c4d,
       album: 'foo',
       title: 'song1',
       __v: 0 },
     { _id: 5cb05ee5f1a14c0fc23f0c4f,
       album: 'foo',
       title: 'song3',
       __v: 0 } ],
  __v: 0,
  album: 'foo' }


0 голосов
/ 12 апреля 2019

Исходя из ваших схем, я заключаю, что у вас есть планы использовать только одну модель (модель «Альбом» для коллекции альбомов).Вы уже создали схему для «Песни».Таким образом, вместо повторения полей в коллекции «Альбом», вложите схему «Песни» в схему «Альбом».Вы можете сделать это следующим образом.

const mongoose = require("mongoose");

var Song = mongoose.Schema('Songs', {
   album: String,
   title: String,
   artist: String,
   genre: String,
   year: Number,
  src: String
});

const AlbumSchema = new Schema({
   album: String,
   songs: [Song]
});

И затем вы можете создать свою 'модель альбома', например,

const Album = module.exports = mongoose.model("Album", AlbumSchema);

Затем, где бы (возможно, контроллер!) Вы ни хотели создатьновая песня, вы можете сделать это,

let newSong = {
    album: 'xxx',
    title: 'xxx',
    artist: 'xxx',
    genre: 'xxx',
    year: 'xxx',
    src: 'xxx'
}

Album.update(
    { _id: album._id },
    { $push: { songs: newSong } }
);
...