mongoose:三路文件join

我正在学习mongoose,需要一些帮助。 我有3个集合,并且在一个API调用中,我想创build3个互相引用的文档; “join”如下:

  • 用户 – 需要引用chirps
  • video – 需要引用chirps
  • 啁啾声 – 需要引用用户和唧唧声

问题:我知道我可以做一个model.create(),并在每个callback中传递新文档,然后更新到相应的文档,但我想知道是否有一个更干净的方法来做到这一点?

对不起,如果我不清楚的问题。 请问我是否有意义。

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); 

Mongo和其他NoSQL数据库不仅是SQL数据库的可互换替代品。 它迫使你以不同的方式重新考虑你的devise。 这个概念不是要定义一个关系。 这个想法是以更less的查询来提供信息。 在Mongo中,数组通常是要避免的,特别是如果它们有可能无限增长的话。 根据你的命名,这似乎是一个强大的可能性。 如果保留模式的其余部分,只需从用户和video模式中删除这两个数组:

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

同样,

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

唯一的问题是.populate()正在你正在拉的每一个啁啾声上运行。 解决这个问题的方法是在chirp文档中对一些(或全部)作者和video文档进行非规范化处理。 我怎么可能devise这个是:

 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 }); 

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