Mongodb 搜索嵌入文档Mongoose+nodejs

Mongodb 搜索嵌入文档Mongoose+nodejs,mongodb,node.js,mongoose,Mongodb,Node.js,Mongoose,我是刚接触猫鼬的,我在搜索方面遇到了一个问题 以下是我的模式: var CommentSchema = new Schema({ body : String , comments : [CommentSchema] }); var PostSchema = new Schema({ body : String , comments : [CommentSchema] }); 有大量的评论。当有人回答现有评论时,我如何才能找到该评论

我是刚接触猫鼬的,我在搜索方面遇到了一个问题

以下是我的模式:

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

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

有大量的评论。当有人回答现有评论时,我如何才能找到该评论

您可以查看github上的mongoose测试套件以获取示例

以下是您正在寻找的内容:

基于嵌入式文档字段的测试查找:

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

一种解决方案是将注释存储为单独的模型,您可以直接查询该模型,并存储对相关objectid的引用以及注释和帖子之间的路径

在与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);
如果这样做,则需要更多的查询才能获取包含所有评论的帖子,这比通过单个查询加载帖子及其完整的评论层次结构要慢。但是,您可以直接查询评论并检索发表评论的帖子,但在发布评论时不容易找到评论的完整路径嵌套的

这些都是权衡;递归搜索注释或独立存储注释,然后递归加载注释的最佳决策应该在应用程序及其预期使用模式的上下文中做出


另一个警告;“填充”功能当前仅限于单个级别的链接对象;您必须在返回的每个注释上调用它才能获得完整的嵌套数据集。有几个插件可以帮助实现这一点,例如,很快它就会在Mongoose中得到本机支持-请参阅。

但此搜索只针对一个嵌套级别。如果我有很深的嵌套结构,我想找到Blog{comments{comments{comments{this comments}}}}}},每次我想找到评论时,我都不知道有多少嵌套层。但是等等。。。它们具有相同的结构注释;让我试试看,它找不到。我想我需要手动搜索它。关键是我不知道正确的方法。若手动搜索,smth像fori=0…{If hasComments recursive},是正确的方法,那个么我将这样做。我只是不知道有没有更简单的方法。p、 无论如何,FindOne方法会找到一篇文章,而不是一篇评论。FindOne方法将始终返回顶级文档,在这种情况下是一篇文章-如果你想直接获取评论文档,你必须将它们放在它们自己的顶级文档中,并通过ObjectId链接它们,请参阅下面我的答案了解如何做到这一点。