Nodejs 一个页面怎么获取 MongoDB 多个集合的数据

Nodejs 一个页面怎么获取 MongoDB 多个集合的数据

nodejs
数据库:mongoDB 问题:首页想展示的内容包括俩个集合的数据,怎么同时获取这两个集合的数据 现在用的方法是

var db = req.db;
var collection = db.collection('xxx');
collection.find({}).toArray(function(err,data){
             res.render('index',{
			'art_list' : data
		});
})

要获取两个集合怎么做,比如要获取xxx和vvv集合改怎么处理,请大神们什么赐教,不胜感激


14 回复

Node.js 如何在一个页面中获取 MongoDB 的多个集合数据

背景介绍

在使用 Node.js 和 MongoDB 构建 Web 应用时,有时需要从多个集合中获取数据,并在同一个页面上展示。本文将介绍如何实现这一需求。

解决方案

为了从多个集合中获取数据并渲染到页面上,我们可以使用异步编程技术来确保所有数据都准备好后再进行渲染。这里我们将使用 async 库来管理异步操作,但也可以使用其他方法如 Promise.allasync/await

示例代码

首先,我们需要安装 mongodbasync 库(如果还没有安装的话):

npm install mongodb async

接下来,我们编写服务器端的代码来获取两个集合的数据,并将其传递给模板引擎进行渲染。

const MongoClient = require('mongodb').MongoClient;
const async = require('async');

// 连接 MongoDB 数据库
MongoClient.connect('mongodb://localhost:27017/mydb', { useUnifiedTopology: true }, (err, client) => {
    if (err) throw err;

    const db = client.db();
    const collection1 = db.collection('xxx');
    const collection2 = db.collection('vvv');

    // 定义一个路由来处理请求
    app.get('/home', (req, res) => {
        async.parallel([
            function(callback) {
                collection1.find({}).toArray((err, data) => {
                    if (err) return callback(err);
                    callback(null, { art_list: data });
                });
            },
            function(callback) {
                collection2.find({}).toArray((err, data) => {
                    if (err) return callback(err);
                    callback(null, { other_data: data });
                });
            }
        ], function(err, results) {
            if (err) throw err;
            
            // 将结果合并后渲染页面
            res.render('index', {
                ...results[0],
                ...results[1]
            });
        });
    });

    // 监听服务器
    app.listen(3000, () => console.log('Server running on port 3000'));
});

解释

  1. 连接数据库:使用 MongoClient.connect 方法连接到 MongoDB。
  2. 定义集合:创建对 xxxvvv 集合的引用。
  3. 路由处理:定义一个 GET 路由 /home,用于处理请求。
  4. 异步并行操作:使用 async.parallel 来并行执行两个查询操作,确保两个集合的数据都能在同一个回调函数中处理。
  5. 合并数据:将从两个集合中获取的数据合并,并通过 res.render 渲染到模板中。

结论

通过这种方式,你可以在 Node.js 中高效地从多个 MongoDB 集合中获取数据,并将其传递给前端模板进行展示。


可以直接将两个集合查出来传到View里啊

collectionA.find().toArray(function(errA, recordsA){
   collectionB.find().toArray(function(errB, recordsB){
       res.render("view", {
         collectionA: recordsA,
         collectionB: recordsB
       });
   });
});

并发访问两个集合

function roll (count, f) {
    var data = {};
    return function (name, err, records) {
        data[name] = { err:err,  records:records };
        count--;
        if (count === 0) {
            f(data);
        }
    };
}

var r = roll(2, function (data) { // … }); collectionA.find().toArray(function(err, records){ r(‘A’, err, records); }); collectionB.find().toArray(function(err, records){ r(‘B’, err, records); });

这个一看就明白了,就是将两个套在一起,用内部去传值 非常感谢

这个要好好研究下,用书上的一个词形容:优雅 学习了,谢谢

优雅。学习了

最终是怎么写的呢?

如果选择async的话,你可以这样写: async.parallel({ a:function(cb){ mongo.getData(params_a,function(err,data){ cb(err,data);
})}, b:function(cb){ mongo.getData(params_b,function(err,data){ cb(err,data) })} },function(err,result){ console.dir(result);//{a:a_reuslt,b:b_result} }) 具体可以看async.js的文档

支持,很棒的原生方法,性能、可读性都很好。

用markdown语法啊。这代码看的难受

var db = req.db; var collection = db.collection(‘xxx’); collection.find({aaa}).toArray(function(err,data){ req.session.aaa=data; next(); }) function next (){ collection.find({bbb}).toArray(function(err,data){ req.session.bbb=data; renderview(); }) }

function renderview(){ res.render(‘index’,{ ‘aaa’:req.session.aaa, ‘bbb’:req.session.bbb }); }

req.session存值最优 对了。。这个基于EXPRESS。。。(忘了。。我写习惯了)

恩 你的这个看明白了 和一楼的方法实现方式一样,就是单独都写个function 给力 多谢了

这个也是我正需要的,谢谢!

要在Node.js中从MongoDB的多个集合中获取数据并将其传递给一个页面,你可以使用Promise或async/await来并发地获取数据。以下是使用mongoose库的示例代码,假设你已经安装了mongoose并且配置好了数据库连接。

首先,确保你已经定义了模型:

const mongoose = require('mongoose');

const xxxSchema = new mongoose.Schema({
    // 定义xxx集合的字段
});

const vvvSchema = new mongoose.Schema({
    // 定义vvv集合的字段
});

const XCollection = mongoose.model('X', xxxSchema);
const VCollection = mongoose.model('V', vvvSchema);

接下来,使用async/await语法来并发地获取两个集合的数据:

router.get('/home', async (req, res) => {
    try {
        const [xxxData, vvvData] = await Promise.all([
            XCollection.find({}).exec(),
            VCollection.find({}).exec()
        ]);

        res.render('index', {
            'art_list': xxxData,
            'other_data': vvvData
        });
    } catch (error) {
        console.error(error);
        res.status(500).send('Server Error');
    }
});

在这个例子中,Promise.all方法用于并发地执行两个查询。当两个查询都完成时,结果将作为数组返回。然后这些数据可以被传递给模板引擎(如EJS)进行渲染。

这种方法的好处在于它不会阻塞事件循环,因为所有的查询都是并发执行的。

回到顶部