Mongoose 更新/架构设计

Posted

技术标签:

【中文标题】Mongoose 更新/架构设计【英文标题】:Mongoose update / schema design 【发布时间】:2012-02-10 16:40:44 【问题描述】:

我正在尝试更新猫鼬模型。有一些困难。这就是我的架构现在的样子。

我希望用户拥有一个包含许多歌曲的库。这些歌曲可以在多个用户库中。并且还可以位于用户可以拥有多个播放列表的多个播放列表中。

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 不在数据库中,则应将其与所有信息一起添加。如果不是,那么它将添加到库(每个用户都有一个)库 ID,除非它已经包含该值。

效果很好。我现在遇到的问题是,当它找到我希望它添加到播放列表的 url 时,当前播放列表的 playlistId 除非它已经在数组中,并且如果它已经在数组中并且传递了一个新的位置值(用户可以更改播放列表的顺序)它应该改变位置的值。

也许我没有以适当的方式对其进行建模。任何提示都会很棒!

【问题讨论】:

【参考方案1】:

MongooseJS 包含一个叫做 DBRef 的东西。我认为您想使用它,而不是自己处理所有引用。

如果某些内容不存在则插入,请先查找并在需要时插入,或者使用upsert。不确定 Mongoose 是否支持 Upserts...

【讨论】:

以上是关于Mongoose 更新/架构设计的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 子文档不会更新

更新架构声明后,Mongoose 不会更新新字段

更新架构声明后,Mongoose 不会更新新字段

MongoDB Mongoose 模式设计

592 架构设计面试精讲 更新中

MongoDB架构设计,用于多项选择题和答案