请帮我理解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
答案 0 :(得分:1)
通常,Mongo使用嵌入式文档或引用来维护关系。 Here is a link from the mongo docs worth reading
您目前正在做的是将手动参考存储到您的邮件集合中的用户集合中。 Mongo手动引用需要额外的查询才能获取引用的数据。在这种情况下,使用基于参考的关系将起作用,但它会强制N + 1查询问题。这意味着您必须为要显示的每条消息以及消息的原始查询添加查询。 References are explained in further detail here.一种解决方案是合并 DBRefs ,这需要特定于语言的驱动程序支持。
另一种选择是使用嵌入式文档。在这种情况下,您将存储嵌入在messages对象中的相关用户对象。 Here is another link to the mongo docs with a great example.在这种情况下,您将进行单个查询,该查询将返回所有消息,其中嵌入了每个相关的用户对象。虽然嵌入式文档鼓励重复数据,但在许多情况下它们提供了性能优势所有这些信息都在mongo文档中进行了解释,可以详细阅读以进一步了解mongo的数据建模。