猫鼬:3路文件加入

时间:2015-02-06 08:23:57

标签: node.js mongodb express mongoose mongoose-populate

我学习猫鼬并需要一些帮助。我有3个集合,在单个API调用中,我想创建3个相互引用的文档; "联接"下面:

  • 用户 - 需要引用啁啾
  • 视频 - 需要引用啁啾
  • 唧唧 - 需要引用用户&线性调频脉冲

问题:我知道我可以做一个model.create()并在每个回调中传入新文档,然后更新到相应的文档,但我想知道是否有&#39这是一个更干净的方式吗?

很抱歉,如果我不清楚这个问题。请问我是否有意义。

代码

var chirpSchema = new mongoose.Schema({
    date_created: { type: Date, default: Date.now }
  , content: { post : String }
  , _video: { type: $oid, ref: "video" }
  , _author: { type: $oid, ref: "user" }
});
var chirp = mongoose.model('chirp', chirpSchema);


var userSchema = new mongoose.Schema({
    date_joined: { type : Date, default: Date.now }
  , cookie_id: String,
  chirp_library: [{type: $oid, ref: "chirp"}]
})
var user = mongoose.model('user', userSchema);


var videoSchema = new mongoose.Schema({
    date_tagged: { type : Date, default: Date.now }
  , thumbnail_url : String
  , _chirps: [{type: $oid, ref: "chirp" }]
});
var video = mongoose.model('video', videoSchema);

1 个答案:

答案 0 :(得分:1)

Mongo和其他NoSQL数据库不仅仅是SQL数据库的可替换替代品。它迫使您以不同的方式重新思考您的设计。这个概念不是要定义一种关系。我们的想法是在较少的查询中提供信息。在Mongo中,数组通常是要避免的,特别是如果它们有可能无限增长。根据您的命名,这似乎很有可能。如果您保留模式的其余部分,只需从用户和视频模式中删除这两个数组:

chirp.find({_author: yourUserId}).populate("_author")为您提供与当前设计中user.findOne({_id: yourUserId})相同的信息。

类似地,

chirp.find({_video: yourVideoId}).populate("_video")video.findOne({_id: yourVideoId})

唯一的问题是.populate()正在你所拉的每一个唧唧声中运行。解决这个问题的方法是在啁啾文档上对一些(或所有)作者和视频文档进行非规范化。我怎么可能设计这个:

var chirpSchema = new mongoose.Schema({
    date_created: { type: Date, default: Date.now },
    content: { 
        post : String 
    },
    _author: { 
        _id: { type: $oid, ref: "video" },
        date_joined: { type: Date, default: Date.now }
    },
    _video: { 
        _id: { type: $oid, ref: "user" },
        date_tagged: { type: Date, default: Date.now },
        thumbnail_url: String
    }
});

var userSchema = new mongoose.Schema({
    date_joined: { type : Date, default: Date.now }
  , cookie_id: String
})

var videoSchema = new mongoose.Schema({
    date_tagged: { type : Date, default: Date.now }
  , thumbnail_url : String
});

重复数据是完全可以的,只要它可以提高您的查询效率。话虽这么说,你需要在阅读和写作之间取得平衡。如果您的用户信息或视频信息定期更改,则您必须更新每个啁啾文档上的数据。如果您的视频/作者中的特定字段定期更改,则可以将该字段从啁啾文档中删除(如果查询中不需要该字段。)