如何使用Node.js从MongoDB的两个不同集合中获取数据
Mongoose 是用于MongoDB的对象数据建模(ODM)库。它定义了一个强类型模式,包含默认值和模式验证,后者被映射到MongoDB文档中。
在NodeJS中使用Mongoose从集合中获取数据,你需要两个必要的东西:
- 模式: 它是一个包含属性及其类型(默认值、验证等)的文档结构,以键值对的形式呈现。
- 模型: 这是一个由定义的模式创建的类,MongoDB文档是模型的实例。因此,它充当MongoDB数据库的接口,用于创建、读取、更新和删除文档。
拥有模型后,我们可以在特定集合的模型上使用 find() 方法来获取集合的文档。
语法:
<Model_Name>.find(<query>,<projection>)
<query>
:这是可选项。它指定了一个选择过滤器,用于使用各种MongoDB查询操作符过滤文档。如果没有传递参数,则返回所有文档。<projection>
:这是可选项。它包含我们想要返回给与查询过滤器匹配的文档的字段。如果没有传递参数,则返回所有字段。
安装Mongoose:
步骤1: 您可以访问链接安装Mongoose模块。您可以使用以下命令安装此包。
npm install mongoose
步骤2: 现在你可以使用以下代码在你的文件中导入mongoose模块:
const mongoose = require('mongoose');
实现:
步骤1: 创建一个文件夹,并将model.js和main.js文件添加到其中。
- model.js: 它包含了您想要使用的所有集合的模式和模型,然后我们导出所有创建的模型,以便可以将其导入到从不同集合中获取数据的文件中。
- main.js: 这是主要的服务器文件,在此文件中,我们将从两个不同的集合中获取数据。
步骤2: 在model.js文件中写下以下代码。
model.js
// Requiring module
const mongoose = require('mongoose');
// Course Modal Schema
const courseSchema = new mongoose.Schema({
_id: Number,
name: String,
category: String
});
// Student Modal Schema
const studentSchema = new mongoose.Schema({
name: String,
enroll: Number,
courseId: Number
});
// Creating model objects
const Course = mongoose.model('course', courseSchema);
const Student = mongoose.model('student', studentSchema);
// Exporting our model objects
module.exports = {
Student, Course
}
数据库: 我们已经在我们的 “Courses” 和 “Students” 集合中有文档,我们将从中获取数据,如下所示:
步骤3: 可以使用mongoose轻松建立数据库连接,如下所示:
mongoose.connect('mongodb://localhost:27017/GFG',
{
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
});
步骤4: 在 main.js 文件中写入以下代码。
main.js
// Requiring mongoose module
const mongoose = require('mongoose');
// Importing Models Student and Course from model.js
const { Student, Course } = require('./model');
// Connecting to database
mongoose.connect('mongodb://localhost:27017/GFG',
{
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
});
var dbcourse = [];
// Finding courses of category Database
Course.find({ category: "Database" })
.then(data => {
console.log("Database Courses:")
console.log(data);
// Putting all course id's in dbcourse array
data.map((d, k) => {
dbcourse.push(d._id);
})
// Getting students who are enrolled in any
// database course by filtering students
// whose courseId matches with any id in
// dbcourse array
Student.find({ courseId: { $in: dbcourse } })
.then(data => {
console.log("Students in Database Courses:")
console.log(data);
})
.catch(error => {
console.log(error);
})
})
.catch(error => {
console.log(error);
})
步骤5: 使用以下命令运行 main.js 文件:
node main.js
解释:
在上述代码中,文件 main.js 中,我们获取所有 Course 集合中分类为 Database 的文档,然后将每个课程的 _id 存储在 dbcourse 数组中,接着获取所有在任何 Database 分类的课程中注册的学生文档。
输出:
我们在下方的控制台中获取来自两个不同集合 Courses 和 Students 的数据: