使用MongoJS从2个不同的MongoDB集合中获取

问题描述 投票:1回答:2

我使用MongoJS以下列方式从mongo db获取数据:app.js:

var db = mongojs('db', ['events']);

然后:

   app.get('/', function(req, res){
    db.events.find(function(err,docs){
        res.render('index', {
        title: 'Events',
        events: docs
    });
    })  
});

这个方法有效,然后我用ejs作为视图引擎以下面的方式获取它:index.ejs:

<% events.forEach(function(event){ %>

<a><%= event.event_name %></a></br>
<a><%= event.event_description %></a> 

<% }) %>

但是,这一切都有效,我如何从同一个ejs页面中的不同集合中获取数据?我一直在尝试以下方式:app.js:编辑成

var db = mongojs('db', ['events', 'groups']);

然后:

app.get('/', function(req, res){
        db.events.find(function(err,docs){
            res.render('index', {
            title: 'Events',
            events: docs
        });
        })  
    });


       app.get('/', function(req, res){
        db.groups.find(function(err,docs){
            res.render('index', {
            title: 'Groups',
            groups: docs
        });
        })  
    });

随后是EJS:

<% groups.forEach(function(group){ %>

            <p><a><%= group.group_name %></a></br>
            <a><%= group.editor %></a></p>
            <a><%= group.members %></a></p>

 <% }) %>

我得到的错误是'groups'没有被定义,但是如果我像这个app.js那样翻转它们:

app.get('/', function(req, res){
            db.groups.find(function(err,docs){
                res.render('index', {
                title: 'Groups',
                groups: docs
            });
            })  
        });

app.get('/', function(req, res){
            db.events.find(function(err,docs){
                res.render('index', {
                title: 'Events',
                events: docs
            });
            })  
        });

然后它说事件没有定义。如何将它们一起声明为一个而没有一个覆盖另一个?如果你能提供帮助,非常感谢你。

javascript mongodb express ejs mongojs
2个回答
0
投票

第一个处理程序执行后,第二个处理程序不执行,因此最简单的方法是将查询链接为:

let events;
app.get('/', function(req, res) {
db.events.find(function(err, docs) {
  events = docs;
  db.groups.find(function(err, docs) {
    res.render('index', {
      title: 'Items',
      groups: docs,
      events: events
    });
  })
});
})

上面的代码可以通过使用promises或async / await来改进。我建议你搜索异步函数,以便在Javascript中更好地编程


0
投票

你只能有一个根app.get('/'...电话。尝试组合您的路线,如下所示:

app.get('/', function(req, res) {
    db.groups.find(function(groupsErr, groupDocs){

        // now get events
        db.events.find(function(eventsErr, eventDocs){
            res.render('index', {
                title: 'Events',
                events: eventDocs,
                groups: groupDocs
            });
        });
    });
});

你也可以使用promises以更漂亮的方式(更少嵌套)处理这个问题。

app.get('/', function(req, res) {
    let groupsPromise = new Promise((res, rej) => {
        db.groups.find((err, docs) => {
            if (!err) res(docs);
            else rej(err);
        });
    });

    let eventsPromise = new Promise((res, rej) => {
        db.events.find((err, docs) => {
            if (!err) res(docs);
            else rej(err);
        });
    });

    Promise.all([groupsPromise, eventsPromise])
    .then(docArr => {
        let groupDocs = docArr[0];
        let eventDocs = docArr[1];

        res.render('index', {
            title: 'Events',
            groups: groupDocs,
            events: eventDocs
        });
    })
    .catch(console.error);
});
© www.soinside.com 2019 - 2024. All rights reserved.