猫鼬:3 种方式文件加入
Mongoose: 3 way document joining
我正在学习猫鼬,需要一些帮助。我有 3 个集合,在一次 API 调用中,我想创建 3 个相互引用的文档; "joins" 下面:
- 用户 - 需要参考 chirps
- 视频 - 需要参考 chirps
- Chirps - 需要引用用户和 chirps
问题: 我知道我可以做一个 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);
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 上。解决此问题的一种方法是对 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 文档中的数据。如果您的 video/author 上有一个定期更改的特定字段,如果查询中不需要该字段,您可以将该字段从 chirp 文档中删除。
我正在学习猫鼬,需要一些帮助。我有 3 个集合,在一次 API 调用中,我想创建 3 个相互引用的文档; "joins" 下面:
- 用户 - 需要参考 chirps
- 视频 - 需要参考 chirps
- Chirps - 需要引用用户和 chirps
问题: 我知道我可以做一个 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);
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 上。解决此问题的一种方法是对 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 文档中的数据。如果您的 video/author 上有一个定期更改的特定字段,如果查询中不需要该字段,您可以将该字段从 chirp 文档中删除。