Мангуст обновление / дизайн схемы - PullRequest
0 голосов
/ 15 января 2012

Я пытаюсь обновить модель мангуста. Наличие некоторых сложностей. Вот так сейчас выглядит моя схема.

Я хочу, чтобы у пользователя была библиотека, состоящая из множества песен. Эти песни могут быть в многопользовательских библиотеках. А также может быть в нескольких плейлистах, из которых пользователь может иметь несколько.

var LibrarySchema = new Schema({
        user: Schema.ObjectId
    });


    var PlaylistSchema = new Schema({
        title: String,
        description: String,
        //songs: [SongsSchema],
        user: Schema.ObjectId
    });


    var SongsSchema = new Schema({
        name: String,
        artist: String,
        album: String,
        time: Number,
        url: String,
        gid: String,
        location: String,
        playlist: [{playlist_id:Schema.ObjectId, position: Number}],
        library: [Schema.ObjectId]
    });

Теперь я хочу сделать что-то вроде проверки, существует ли уже URL в схеме песни (url является индексом). Если эта песня не существует, я хочу добавить ее со всеми значениями. Однако, если песня существует, я хочу добавить плейлист и поместить его в и библиотеку.

Например, вот запрос, который я сейчас пытаюсь:

Song.update({url: s.url, "playlist.playlist_id": playlistId}, {$set: {name: s.name,    artist: s.artist, album: s.album, time: s.time, url: s.url}, $addToSet: {playlist: {playlist_id: playlistId, position: s.position}, library: libId}},{upsert: true}, function(err, data) {});

А это пример сохраненной базы данных:

{ "name" : "Kanye West - All Of The Lights ft. Rihanna, Kid Cudi", "artist" : "unknown",   "album" : "unknown", "time" : 328, "url" : "HAfFfqiYLp0", "_id" : ObjectId("4f127923ce0de70000000009"), "library" : [ ObjectId("4f1203af23c98cfab1000006") ],  "playlist" : [
{
    "playlist_id" : ObjectId("4f127923ce0de70000000007"),
    "position" : "1"
}
] }
{ "name" : "Kanye West - Heartless", "artist" : "unknown", "album" : "unknown", "time" : 221, "url" : "Co0tTeuUVhU", "_id" : ObjectId("4f127923ce0de7000000000a"), "library" : [ ObjectId("4f1203af23c98cfab1000006") ], "playlist" : [
{
    "playlist_id" : ObjectId("4f127923ce0de70000000007"),
    "position" : "2"
}
] }
{ "name" : "Kanye West - Stronger", "artist" : "unknown", "album" : "unknown", "time" :  267, "url" : "PsO6ZnUZI0g", "_id" : ObjectId("4f127923ce0de7000000000b"), "library" : [  ObjectId("4f1203af23c98cfab1000006") ], "playlist" : [
{
    "playlist_id" : ObjectId("4f127923ce0de70000000007"),
    "position" : "3"
}
] }

Теперь, что я пытаюсь сделать, если URL-адрес песни отсутствует в базе данных, он должен добавить его со всей информацией. Если это не так, то он добавит в библиотеку (которой обладает каждый пользователь) идентификатор библиотеки, ЕСЛИ он уже содержит это значение.

Это работает довольно хорошо. Проблема, с которой я сталкиваюсь сейчас, заключается в том, что когда он находит URL-адрес, который я хочу добавить в список воспроизведения, playlistId текущего списка воспроизведения, ЕСЛИ он уже находится в массиве, и если ему было передано новое значение для позиции (пользователь может изменить порядок списка воспроизведения) он должен изменить значение позиции.

Возможно, я не моделирую это должным образом. Любые советы будут великолепны!

1 Ответ

0 голосов
/ 16 января 2012

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

Для вставки, если чего-то нет, сначала выполните поиск и вставьте, если необходимо, или используйте upsert . Не уверен, что Mongoose поддерживает Upserts, хотя ...

...