如何从现有的 collection 添加到新的 collection
How to add to a new collection from an existing collection
所以我正在创建一个音乐播放器,并想从歌曲模式(已创建)创建专辑模式。
在专辑架构中有一个专辑标题和一组歌曲。现在如果歌曲名称相同,我想将它们添加到专辑中。
如何实现?
我已经按专辑名称对歌曲 collection 进行了排序,但不知道如何将这些歌曲添加到歌曲数组中(如果它们具有相同的专辑名称)。
//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
}]
});
还有办法在专辑架构中嵌套歌曲架构吗?
根据您的模式设计,我得出的结论是您计划只使用一个模型(相册 collection 的 'Album' 模型)。您已经为 'Songs' 创建了一个架构。因此,不要在 'Album' collection 中重复字段,而是在 'Album' 架构中嵌套 'Songs' 架构。
您可以按如下方式进行。
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]
});
然后你可以创建你的'Album model'喜欢,
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 } }
);
//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 方法来检查对象是否已分配。如果不是,我们将创建新对象并将其放入一个数组中
如果存在,我们将获取该对象并将歌曲推送到该对象。
希望这会有所帮助
如果您已经有了歌曲集,并且需要查找特定专辑中的歌曲,您可以使用此方法:
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' }
所以我正在创建一个音乐播放器,并想从歌曲模式(已创建)创建专辑模式。
在专辑架构中有一个专辑标题和一组歌曲。现在如果歌曲名称相同,我想将它们添加到专辑中。
如何实现?
我已经按专辑名称对歌曲 collection 进行了排序,但不知道如何将这些歌曲添加到歌曲数组中(如果它们具有相同的专辑名称)。
//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
}]
});
还有办法在专辑架构中嵌套歌曲架构吗?
根据您的模式设计,我得出的结论是您计划只使用一个模型(相册 collection 的 'Album' 模型)。您已经为 'Songs' 创建了一个架构。因此,不要在 'Album' collection 中重复字段,而是在 'Album' 架构中嵌套 'Songs' 架构。 您可以按如下方式进行。
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]
});
然后你可以创建你的'Album model'喜欢,
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 } }
);
//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 方法来检查对象是否已分配。如果不是,我们将创建新对象并将其放入一个数组中 如果存在,我们将获取该对象并将歌曲推送到该对象。 希望这会有所帮助
如果您已经有了歌曲集,并且需要查找特定专辑中的歌曲,您可以使用此方法:
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' }