【问题标题】:Displaying content from different mongoose tables on one view在一个视图上显示来自不同 mongoose 表的内容
【发布时间】:2016-01-30 07:28:00
【问题描述】:

我是一名(相对缺乏经验的)Java EE 开发人员,希望学习 node.js。我正在使用 express 框架、mongodb 和 mongoose 框架。我一直在使用类似 mvc 的架构构建一个简单的博客站点(仅供练习)。它将有 4 个 mongodb 集合:post、image、user、comment。基本模式如下:

postSchema = mongoose.Schema({
    id: Number,
    dateCreated, {type: Date, default: Date.now}
    title: String,
    content: String
});
var Post = mongoose.model('Post', postSchema);

imageSchema = mongoose.Schema({
    id: Number, 
    postId: Number,
    path: String
});

var Image = mongoose.model('Image', imageSchema);

userSchema = mongoose.Schema({
    id: Number, 
    username: String,
    password: String,
    email: String
});

var User = mongoose.model('User', userSchema);

commentSchema = mongoose.Schema({
    id: Number,
    postId: Number,
    userId: Number, 
    dateCreated: {type: Date, default: Date.now},
    content: String
});

var Comment = mongoose.model('Comment', commentSchema);

我希望能够在一个页面上显示帖子、图像、cmets 和用户信息。我的问题是我不太清楚如何以异步方式检索和发送所有这些数据。这似乎是我发现的大多数示例所做的(不一定都在一个文件中):

app.get('/', function(res, req) {
    Post.findOne(function(err, post) {
         if (err) return res.send(500);
         res.render('index', post);
    });
});

这对我不起作用,因为我也会从图像、评论和用户集合中获取信息。有没有异步的方法来做到这一点?如果没有,有没有办法重新配置我所拥有的,以便它可以是异步的? (我正在尝试了解异步编程。)

提前致谢!

【问题讨论】:

    标签: node.js mongodb asynchronous express mongoose


    【解决方案1】:

    按原样执行此操作的简单方法是使用 Promise 并同时执行异步操作:

    Post.findOne(id).then(post => {
        let postId = post.id;
        return Promise.all([
            Comments.find({postId}),
            Images.find({postId}),
            // Not sure what query you need here
            User.find(),
            post,
        ]);
    }).then(data => {
        let [comments, images, users, post] = data;
        res.render('index', {comments, images, users, post});
    });
    

    在您的index 模板中,您将拥有一个具有四个属性的对象。

    您可以在没有 Promise 的情况下同时执行异步操作,但我会留给其他人来讨论。我更喜欢使用 Promise。


    Mongoose 还允许您使用其他模式定义作为数据类型,如下所示:

    commentSchema = mongoose.Schema({
        id: Number,
        postId: Post,
        userId: User, 
        dateCreated: {type: Date, default: Date.now},
        content: String
    });
    

    在这种情况下,您可以在一些查询之后使用.populate,以便在后台执行另一个查询——例如获取评论的帖子数据。


    由于您使用的是 MongoDB——一个 NoSQL 数据库——我会考虑对数据进行非规范化并使其保持平坦。 Firebase, which stores data in a similar structure has a great article on how to store and use denormalized data

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多