对此的一个解决方案是将Comments存储为一个单独的模型,您可以直接查询该模型,并存储对相关ObjectId的引用以及Comments和Posts之间的路径。
使用Mongoose相关文档中的填充功能可以与嵌入文档类似,尽管在查询它们的方式上存在一些重要差异,并且必须更加小心地填充关系。
设置如下:
var mongoose = require( mongoose )
, Schema = mongoose.Schema
, ObjectId = Schema.Types.ObjectId;
var PostsSchema = new Schema({
body : String,
stories : [{ type: ObjectId, ref: Story }]
});
var CommentsSchema = new Schema({
body : String,
post : { type: ObjectId, ref: Post },
comments : [{ type: ObjectId, ref: Comment }]
});
var Story = mongoose.model( Post , PostsSchema);
var Comment = mongoose.model( Comment , CommentsSchema);
如果你这样做,它需要更多的查询才能获得包含所有评论的帖子(这比用一个查询加载帖子及其完整的评论层次结构要慢),但是你可以直接查询评论并检索他们发表的帖子(但在嵌套评论时不容易找到评论的完整路径)。
这些都是权衡;最好的决定(要么递归地搜索注释,要么独立存储注释,然后递归地加载注释)应该在应用程序及其预期使用模式的上下文中做出。
另一个警告;填充特征当前被限制为链接的ObjectId的单个级别;您必须在返回的每个注释上调用它才能获得完整的嵌套数据集。有几个插件可以帮助实现这一点,例如猫鼬子种群,很快它将在mongoose中得到本地支持-请参阅此处出现github问题。