node.js - 显示消息所有者

标签 node.js mongodb node-mongodb-native

请帮助我理解 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 原生

最佳答案

通常,Mongo 使用嵌入文档引用来维护关系。 Here is a link from the mongo docs worth reading .

您当前正在执行的操作是在消息集合中存储对用户集合的手动引用。 Mongo 手动引用需要额外的查询才能获取引用的数据。在这种情况下,使用基于引用的关系会起作用,但它会强制出现 N+1 查询问题。这意味着您必须对要显示的每条消息以及消息的原始查询进行附加查询。 References are explained in further detail here.一种解决方案是合并 DBRefs ,这需要特定于语言的驱动程序支持。

另一种替代方法是使用嵌入文档。在这种情况下,您将存储嵌入在消息对象中的相关用户对象。 Here is another link to the mongo docs with a great example.在这种情况下,您将进行一个查询,该查询将返回所有消息,其中嵌入了每个相关的用户对象。尽管嵌入文档鼓励重复数据,但在许多情况下它们提供了性能优势。所有这些信息都在 mongo 文档中进行了解释,可以详细阅读以进一步了解 mongo 的数据建模。

此外,mongoose图书馆非常棒,有一个 populate功能,有助于引用。

关于node.js - 显示消息所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16107209/

相关文章:

node.js - SQL Server : lower camelcase for each result

javascript - 如何在 CI 环境下运行 postman 的 newman?

angularjs - 如何在 MongoDB 数据库中保存文件?

node.js - 一个迁移文件中的多个迁移语句

javascript - MongoDB $geoNear 距离返回值精度下降

node.js - 无法循环 MongoDB 集合函数

node.js - 如何在 node.js 断开连接期间缓冲 MongoDB 插入?

mongodb - 如何在 MongoDB 的一个命令中更新增量两个字段?

node.js - Mongoose 子文档排序

node.js - 通过 Monk 在 MongoDB 集合上使用 find 方法