2011-06-01 85 views
0

Im新到Mongoose,我在搜索时遇到问题。搜索嵌入式文档Mongoose + nodejs

这是我的架构:

var CommentSchema = new Schema({ 
    body  : String 
    , comments : [CommentSchema] 
}); 

var PostSchema = new Schema({ 
    body  : String 
    , comments : [CommentSchema] 
}); 

有评论的深度嵌套。当有人回答现有评论时,我怎么能找到那个评论?

回答

0

你可以看看github上的mongoose测试套件的例子。基于嵌入式文档字段

测试发现:

model_querying_test

这里是你在找什么

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(); 
     }); 
    }); 
    }, 
+0

但是这个搜索仅适用于一个嵌套级别。如果我有很深的嵌套结构,我想找到 '博客 { 评论 { 评论 { 评论 {此评论} }}}' ,我想每次都发现发表评论我不不知道有多少嵌套层次。 – kulebyashik 2011-06-02 06:54:39

+0

但等等...他们有相同的结构 '评论.add({ 评论:[评论] });' 让我试试 – kulebyashik 2011-06-02 06:57:30

+0

nope,它没有找到它。猜猜我需要手动搜索它。关键是我不知道“正确的方式”。如果手动搜索,如'for(i = 0 ...){if(hasComments)recursive()}',是正确的,所以我会这样做。我只是不知道是否有更简单的方法。 p.s.无论如何FindOne方法找到一篇文章,而不是评论.. – kulebyashik 2011-06-02 07:39:15

0

一种解决方法是存储评论作为一个单独的模型,你可以直接查询,并存储对Comments和Posts之间相关ObjectIds和路径的引用。

使用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); 

如果你做这种方式它需要更多的查询来获得与它的所有意见后(这将是比能装入邮政及其完整的慢但是您可以直接查询评论并检索他们制作的帖子(但在嵌套时不容易找到评论的完整路径)。

这些都是取舍;最好的决定(递归搜索注释或独立存储,然后递归加载它们)应该在应用程序的上下文中及其预期的使用模式中进行。

另外一个警告;填充功能目前仅限于单级链接的ObjectIds;您必须对每个返回的评论调用它以获取完整的嵌套数据集。有几个插件可以帮助解决这个问题,比如mongoose-subpopulate,很快它就会在Mongoose中得到本地支持 - 请参阅github issue here