2016-01-21 5 views
0

У меня есть следующие почтовые и сбора документов:Как эффективно получать комментарии для сообщений с MongoDB/mongoose?

// posts 
{ 
    "_id" : ObjectId("56978d8cdbc511a81e7e2ea8"), 
    "body" : "Post body 1", 
    "created_at" : 1452772748737 
}, 
{ 
    "_id" : ObjectId("56978d3cdbc655b81e7e2e10"), 
    "body" : "Post body 2", 
    "created_at" : 1452772759731 
} 

// comments 
{ 
    "_post" : ObjectId("56978d8cdbc511a81e7e2ea8"), 
    "body" : "Comment 1" 
}, 
{ 
    "_post" : ObjectId("56978d3cdbc655b81e7e2e10"), 
    "body" : "Comment 2" 
} 

мне нужно запросить все сообщения со всеми комментариями быть следующий результат:

{ 
    "_id" : ObjectId("56978d8cdbc511a81e7e2ea8"), 
    "body" : "Post body 1", 
    "created_at" : 1452772748737, 
    "comments": [{ 
     "_post" : ObjectId("56978d8cdbc511a81e7e2ea8"), 
     "body" : "Comment 1" 
    }] 
}, 
{ 
    "_id" : ObjectId("56978d3cdbc655b81e7e2e10"), 
    "body" : "Post body 2", 
    "created_at" : 1452772759731, 
    "comments": [{ 
     "_post" : ObjectId("56978d3cdbc655b81e7e2e10"), 
     "body" : "Comment 2" 
    }] 
} 

Моя схема для поста и коллекции выглядят следующим образом:

// post 
var PostSchema = mongoose.Schema({ 

},{ 
    strict: "throw", 
    collection: "posts" 
}); 

PostSchema.add({ 
    created_at: { 
     type: Number, 
     'default': Date.now 
    } 
}); 

PostSchema.add({ 
    title: { 
     type: String 
    } 
}); 

PostSchema.add({ 
    body: { 
     type: String 
    } 
}); 

// comment 
var CommentSchema = mongoose.Schema({ 

},{ 
    strict: "throw", 
    collection: "comments" 
}); 

CommentSchema.add({ 
    _post: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Post' 
    } 
}); 

CommentSchema.add({ 
    body: { 
     type: String 
    } 
}); 

Каков эффективный способ получить результат выше?

+1

Посмотрите здесь: http://seanhess.github.io/2012/02/01/mongodb_relational.html. Почему вы разделяете сообщения и комментарии в 2 сборника? –

+1

Можете ли вы показать модель, определенную для сообщений и комментариев? –

+0

@NaeemShaikh Я обновил сообщение – Erik

ответ

1

Попробуйте сделать это через mongoose populate и aggregate. Пример кода, как показано ниже.

var Post = mongoose.model('Post', PostSchema); 
var Comment = mongoose.model('Comment', CommentSchema); 

Comment.aggregate([ 
    {$group: {_id: '$_post', comments: {$push: '$body'}}} 
    // ... 
    ], function(err, result) { 
     if (err) 
      // error handling 
     Post.populate(result, {path: "_id"}, function(err, ret) { 
      if(err) 
       console.log(err); 
      else 
       console.log(ret); 
     }); 
});