Mongoose:3 路文件加入
Posted
技术标签:
【中文标题】Mongoose:3 路文件加入【英文标题】:Mongoose: 3 way document joining 【发布时间】:2015-04-06 08:08:36 【问题描述】:我正在学习猫鼬,需要一些帮助。我有 3 个集合,在一次 API 调用中,我想创建 3 个相互引用的文档; “加入”下面:
用户 - 需要参考啁啾 视频 - 需要参考唧唧喳喳 啁啾 - 需要参考用户和啁啾问题:我知道我可以做一个 model.create() 并在每个回调中传入新文档,然后更新到相应的文档,但我想知道是否有更清洁的怎么办?
对不起,如果我不清楚这个问题。请问有什么不明白的地方。
代码
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);
【问题讨论】:
afaik,你不能在数组中做引用,所以你基本上只保存引用只有一个 '1' end of '1-n' 关系 你能解释一下“只保存一个'1-n'关系的'1'结尾的引用”吗? 您只能在chirp
架构中引用视频和作者。 user
和 video
架构不会有它
【参考方案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()
在你拉的每一个啁啾上运行。解决此问题的一种方法是对 chirp 文档上的部分(或全部)作者和视频文档进行非规范化。我可能会如何设计:
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 文档中删除。
【讨论】:
以上是关于Mongoose:3 路文件加入的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose/mongoDB 查询加入.. 但我来自 sql 背景