显示消息所有者

请帮助我理解mongodb。 有三个集合:线程,消息和用户。

线

{ "title" : "1212", "message" : "12121", "user_id" : "50ffdfa42437e00223000001", "date" : ISODate("2013-04-11T19:48:36.878Z"), "_id" : ObjectId("51671394e5b854b042000003") } 

信息

 { "message" : "text", "image" : null, "thread_id" : "51671394e5b854b042000003", "user_id" : "516d08a7772d141766000001", "date" : ISODate("2013-04-17T15:58:07.021Z"), "_id" : ObjectId("516ec68fb91b762476000001") } 

用户

 { "user" : "admin", "date" : ISODate("2013-04-16T08:15:35.497Z"), "status" : 1, "_id" : ObjectId("516d08a7772d141766000001") } 

如何显示当前线程的所有消息,并从用户集合中获取用户名(用于评论)?

此代码只获取没有用户名的消息

 exports.getMessages = function(id, skip, callback) { var skip = parseInt(skip); messages.find({thread_id: id}).sort({date: 1}).skip(skip).limit(20).toArray( function(e, res) { if (e) { callback(e)} else callback(null, res) }); }; 

Node.js和mongo native

一般来说,Mongo使用embedded式文档引用来维护关系。 这里是一个值得阅读的mongo文档的链接 。

您目前正在做的是在您的消息收集中存储对用户集合的手动引用 。 Mongo手工引用需要额外的查询才能获得引用的数据。 在这种情况下,使用基于引用的关系将起作用, 但这会强制N + 1查询问题 。 这意味着你将不得不为每个你想要显示的信息添加一个查询,加上对消息的原始查询。 这里进一步详细解释参考。 一种解决scheme是整合DBRefs ,这需要语言特定的驱动程序支持。

另一种select是使用embedded式文档。 在这种情况下,您将存储embedded到消息对象中的相关用户对象。 这里是一个很好的例子与蒙戈文件的另一个链接。 在这种情况下,您将进行一个查询,该查询将返回所有消息,并将每个相关的用户对象embedded其中。 尽pipeembedded式文档鼓励重复数据,但在很多情况下,它们提供了性能优势 所有这些信息在mongo文档中进行了解释,并且可以详细阅读以进一步了解mongo的数据build模。

此外, mongoose库非常棒,并有一个填充function,这是有用的参考。