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集合改怎么处理,请大神们什么赐教,不胜感激
Node.js 如何在一个页面中获取 MongoDB 的多个集合数据
背景介绍
在使用 Node.js 和 MongoDB 构建 Web 应用时,有时需要从多个集合中获取数据,并在同一个页面上展示。本文将介绍如何实现这一需求。
解决方案
为了从多个集合中获取数据并渲染到页面上,我们可以使用异步编程技术来确保所有数据都准备好后再进行渲染。这里我们将使用 async
库来管理异步操作,但也可以使用其他方法如 Promise.all
或 async/await
。
示例代码
首先,我们需要安装 mongodb
和 async
库(如果还没有安装的话):
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'));
});
解释
- 连接数据库:使用
MongoClient.connect
方法连接到 MongoDB。 - 定义集合:创建对
xxx
和vvv
集合的引用。 - 路由处理:定义一个 GET 路由
/home
,用于处理请求。 - 异步并行操作:使用
async.parallel
来并行执行两个查询操作,确保两个集合的数据都能在同一个回调函数中处理。 - 合并数据:将从两个集合中获取的数据合并,并通过
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 给力 多谢了