我是Mongoose的新手,在搜索时遇到了问题。
这些是我的模式:
var CommentSchema = new Schema({
body : String
, comments : [CommentSchema]
});
var PostSchema = new Schema({
body : String
, comments : [CommentSchema]
});
评论嵌套很深。当有人回答现有的评论时,我如何才能找到它?
您可以查看github上的mongose测试套件以获取示例。
模型_查询_测试
以下是您正在寻找的内容:
基于嵌入式文档字段的测试发现:
function () {
var db = start(), BlogPostB = db.model('BlogPostB', collection);
BlogPostB.create({comments: [{title: 'i should be queryable'}]}, function (err, created) {
should.strictEqual(err, null);
BlogPostB.findOne({'comments.title': 'i should be queryable'}, function (err, found) {
should.strictEqual(err, null);
found._id.should.eql(created._id);
db.close();
});
});
},
一种解决方案是将Comments存储为一个单独的模型,您可以直接查询该模型,并存储对相关ObjectId的引用以及Comments和Posts之间的路径。
在Mongoose相关文档中使用Populate功能可以类似于嵌入式文档,尽管在查询它们的方式上存在一些重要差异,并且必须更加小心地填充关系。
设置如下:
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子种群,很快它就会在mongoose中得到本地支持——请参阅这里的github问题。