如何使子文档在mongodb中有两个父文档?

时间:2014-01-26 17:37:52

标签: node.js mongodb mongoose

我正在将mongooseNode.js用于应用程序。我有一个Document类,它有一个Review子文档。我也有一个User课程。

我希望用户能够看到他们所做的所有评论,同时我也希望Document能够轻松获得所有评论。搜索所有文档及其所有评论以查找与用户匹配的文档似乎非常无效。那么,我如何允许ReviewDocument拥有User

如果这是不可能的,我还能如何有效让两个文档了解一个子文档。

2 个答案:

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

然后,您可以有效地查询评论以获取用户或文档的所有评论。

希望这有助于某人。