我正在将mongoose
与Node.js
用于应用程序。我有一个Document
类,它有一个Review
子文档。我也有一个User
课程。
我希望用户能够看到他们所做的所有评论,同时我也希望Document
能够轻松获得所有评论。搜索所有文档及其所有评论以查找与用户匹配的文档似乎非常无效。那么,我如何允许Review
和Document
拥有User
?
如果这是不可能的,我还能如何有效让两个文档了解一个子文档。
答案 0 :(得分:0)
如果您不想处理一致性问题,我认为除了为文档分配两个父项的规范化之外没有任何其他方法。您的问题是社交网络的常见问题,当开发人员必须与朋友,关注者等打交道时。通常最好的解决方案取决于您将要运行的查询,哪些数据是易变的,哪些不是,以及文档可能有多少子有。通常情况下,它是嵌入和引用之间的平衡。如果我是你,我会怎么做:
我们假设文档通常有0-5评论。这是一些,所以我们可能会考虑将评论嵌入到文档中。此外,我们经常需要在每次查询文档时显示评论,这是嵌入的另一个原因。现在我们需要一种方法来有效地查询用户的所有评论。假设我们不像第一个那样经常运行此查询,但仍然很重要。让我们假设当我们查询用户的评论时,我们只想将评论标题显示为评论页面甚至文档页面的链接,因为可能很难在没有看到实际文档的情况下阅读评论。所以这里最好的方法是存储{document_id,review_id,reviewTitle}。在这种情况下,ReviewTitle不应该是易变的。所以现在当你有一个User对象时,你可以轻松查询评论。使用document_id,您将过滤掉大多数文档,并且速度非常快。然后,您可以在客户端获得所需的评论,或者使用MapReduce将评论转换为单独的文档列表。
此示例包含许多假设,因此我的目标可能并不完全符合您的目标,即向您展示设计集合时应考虑的最重要事项以及您应遵循的逻辑。总而言之,考虑一下QUERIES,挥霍无度的一些数据以及GONNA有多少儿童文件,并在嵌入和引用之间找到平衡
希望它有所帮助!
答案 1 :(得分:0)
这是一个老问题,但我认为这是一个很好的解决方案:
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var DocumentSchema = new Schema({
title: String,
...
});
mongoose.model('Document', DocumentSchema);
var UserSchema = new Schema({
name: String,
...
});
mongoose.model('User', UserSchema);
var ReviewSchema = new Schema({
created: {
type: Date,
default: Date.now
},
document: {
type: Schema.ObjectId,
ref: 'Document'
},
reviewer: {
type: Schema.ObjectId,
ref: 'User'
},
title: String,
body: String
});
然后,您可以有效地查询评论以获取用户或文档的所有评论。
希望这有助于某人。