首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬:3路文档连接

猫鼬:3路文档连接
EN

Stack Overflow用户
提问于 2015-02-06 08:23:56
回答 1查看 164关注 0票数 1

我在学猫鼬,需要帮助。我有3个集合,在一个API调用中,我希望创建3个相互引用的文档;下面是“联接”:

  • 用户-需要参考啁啾
  • 视频-需要参考啁啾
  • 啁啾-需要参考用户&啁啾

问题:--我知道我可以在每个回调中执行model.create()并传入新文档,然后更新到相应的文档,但是我想知道是否有一种更干净的方法?

如果我对这个问题不太清楚,很抱歉。如果有什么不合理的地方请问我。

代码

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-20 04:24:44

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()是运行在每一个啁啾你正在拉。解决这个问题的一种方法是对chirp文档上的一些(或全部)作者和视频文档进行去或删除。我将如何设计这是:

代码语言:javascript
复制
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
});

重复数据是完全可以的,只要它能提高查询的效率。话虽如此,你需要在阅读和写作之间取得平衡。如果用户信息或视频信息经常发生变化,则必须更新每个chirp文档上的数据。如果您的视频/作者中有一个特定字段是定期更改的,则如果查询中没有必要,可以将该字段从chirp文档中删除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28361433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档