如何在Node.js中对MongoDB数据库的记录进行自定义排序
本文将为我们介绍如何对MongoDB数据库中的记录进行排序。我们将在sort() 函数中添加一些排序功能,以便给记录定位。
最后,我们将能够。
- 使用Node Package Manager在Node.js应用程序中安装和配置MongoDB驱动程序。
- 从MongoDb数据库查询和排序结果。
- 使用数组为记录提供自定义排名。
前提条件
作为先决条件,读者必须具备。
- 对Node.js和MongoDB操作有基本了解。
- 在你的机器上安装了Node.js和MongoDB。
简介
在我们的日常生活问题中,我们在某一时刻需要对数据进行分类,以使我们对如何进行操作有更深入的了解。
例如,在学校设置中,我们需要分析学生的成绩,并根据他们的表现给予他们适当的职位。由于这个原因,我们总是要记住,两个或更多的人将会得到相同的分数或点数。
作为开发者,我们必须对系统进行编程,使学生获得相同的位置,而在他们之后的下一个学生则获得适当的递增的位置。
例如,对于这五个学生和他们的分数,我们将进行如下操作。
| 学生姓名 | 积分 | 位置 |
|---|---|---|
| 学生1 | 21 | POS 1 |
| 学生2 | 38 | POS 2 |
| 学生3 | 90 | POS 3 |
| 学生4 | 90 | POS 4 |
| 学生5 | 58 | POS 5 |
分类后。
| 学生姓名 | 分数 | 位置 |
|---|---|---|
| 学生3 | 90 | POS 1 |
| 学生4 | 90 | POS 1 |
| 学生5 | 58 | POS 3 |
| 学生2 | 38 | POS 4 |
| 学生1 | 21 | POS 5 |
我们可以看到,前两个学生在第一位置打成平手(POS 1),而下一个学生从第三位置开始(POS 3)。
帮助我们实现这一目标的一个好方法是,使用MongoDB的sort() 方法。对我们来说,唯一的问题是处理好并列关系,并给他们适当的位置。
在这篇文章中,我们将看看如何在Node.js中使用数组,使我们从MongoDB数据库的文档(记录)中实现这一目标。
我们要做的是
我们将建立一个与MongoDB数据库的连接,插入一些假数据,并使用一个自定义排名函数对它们进行排序。
开始工作
我们首先需要安装MongoDB驱动,这将使我们能够连接到数据库。
打开你的终端,输入这个命令。
npm install mongodb
创建我们的数据库
我们将创建一个名为ourDB 的新数据库,在这里我们将存储我们的记录(在MongoDB中称为documents )。
创建一个名为database.js 的新文件,然后编写以下代码。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/ourDB";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
console.log("Database created!");
db.close();
});
通过在终端运行下面的命令来执行该代码。
node database.js
要运行该代码,我们使用命令node [FILENAME] 。
创建我们的集合
然后我们继续创建一个表(MongoDB中的collection ),称为我们的ourTable ,我们的记录(documents )将从这里插入和查询。
创建一个名为collection.js 的新文件,然后输入以下代码。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("ourDB");
dbo.createCollection("ourTable", function(err, res) {
if (err) throw err;
console.log("Collection created!");
db.close();
});
});
上面的代码片段创建了一个MongoDB连接,并创建了一个名为ourTable 的新集合。
向我们的表插入文件
为了演示,我们将在我们的集合中插入一些10个学生的假数据。
创建一个名为insert.js 的文件,然后添加以下代码。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("ourDB");
var myobj = [
{ name: 'John', mark: '71'},
{ name: 'Doe', mark: '44'},
{ name: 'Lorem', mark: '52'},
{ name: 'Ipsum', mark: '21'},
{ name: 'Tony', mark: '21'},
{ name: 'Stark', mark: '51'},
{ name: 'Steve', mark: '22'},
{ name: 'Mike', mark: '11'},
{ name: 'Holmes', mark: '88'},
{ name: 'Dave', mark: '71'}
];
dbo.collection("ourTable").insertMany(myobj, function(err, res) {
if (err) throw err;
console.log("Number of documents inserted: " + res.insertedCount);
db.close();
});
});
查询并给我们的文件排名
这就是本文的核心所在。
我们将使用学生的分数按降序进行查询和排序。然后,我们将把总分数填充到一个数组中,并执行条件检查以检查并列关系,并适当地给予排名。
我们创建一个名为rank.js 的新文件,然后添加以下代码。
// establishing a connection to the database
var MongoClient = require('mongodb').MongoClient;
// connection url
var url = "mongodb://localhost:27017/";
// declaring an array and a variable to be used for the database manipulation
let rankArray = [];
let dbo;
// connecting and calling the loadStudents() function
MongoClient.connect(url, function(err, db) {
if (err) throw err;
dbo = db.db("ourDB");
loadStudents();
db.close();
});
我们有两个函数loadStudents() 和giveRank() 。
loadStudents() 函数从数据库中加载学生的详细信息,并使用sort() 方法对其进行降序排序。
它包含一个for loop ,将加载的分数填充到rankArray() ,我们将在后面使用。
然后调用第二个函数giveRank() ,使用rankArray 和results 进行排序。
function loadStudents(){
// specifying a descending sort
var mysort = { mark: -1 };
// querying and loading into a resultSet array
dbo.collection("ourTable").find().sort(mysort).toArray(function(err, result) {
// check for any error and throw it
if (err) throw err;
// populating the rank array with the marks
for (let i = 0; i < result.length; i++) {
rankArray[i] = result[i]['mark'];
}
// passing the rank array and the resultset to the giveRank() function
giveRank(rankArray,result);
});
}
giveRank() 函数需要两个参数:一个数组和一个 resultSet。
// function for giving rank
function giveRank(arrayArg,resultArg){
// declaring and initilising variables
let rank = 1;
prev_rank = rank;
position = 0;
// displaying the headers in the console
console.log('\n-------OUR RESULTS------\n');
console.log('Name | Mark | Position\n');
// looping through the rank array
for (i = 0; i < arrayArg.length ; i ++) {
/*
If it is the first index, then automatically the position becomes 1.
*/
if(i == 0) {
position = rank;
console.log (resultArg[i]['name']+"\t"+arrayArg[i]+"\t"+position)+"\n";
/*
if the value contained in `[i]` is not equal to `[i-1]`, increment the `rank` value and assign it to `position`.
The `prev_rank` is assigned the `rank` value.
*/
} else if(arrayArg[i] != arrayArg[i-1]) {
rank ++;
position = rank;
prev_rank = rank;
console.log(resultArg[i]['name']+"\t"+arrayArg[i]+"\t"+position)+"\n";
/*
Otherwise, if the value contained in `[i]` is equal to `[i-1]`,
assign the position the value stored in the `prev_rank` variable then increment the value stored in the `rank` variable.*/
} else {
position = prev_rank;
rank ++;
console.log (resultArg[i]['name']+"\t"+arrayArg[i]+"\t"+position)+"\n";
}
}
}
它有三个变量。
rank- 它控制用于显示适当递增的位置的循环计数,例如, ,而不是 。1,1,31,1,2
我们把它初始化为
1,因为我们从1,而不是0开始索引位置。
prev_rank- 在出现平局的情况下,前一等级用于显示等级位置。它存储了一个学生的当前位置 ,这样当循环递增到下一个位置 ,当前位置 被暂时存储。因此,当前位置被定为 ,下一个位置被定为 。如果在 找到的值与 相同, 只会被分配到上一个等级并被赋予下一个数组索引。它的第一个位置被分配为 。[i]``[i+1][i][i-1][i][i][i-1][i]1position- 这存储了要显示的等级。我们把它初始化为 ,其中的初始化值并不重要,因为位置被分配在 内。你可以把它初始化为任何数字。0for loop
for loop 包含一个if-else-if 结构,用于检查数值并适当地分配它们。
如果它是第一个索引,那么位置自动变成1 。
如果[i] 中包含的值不等于[i-1] ,则递增rank 的值并将其分配给position 。正如我们上面讨论的那样,prev_rank 再次分配给rank 的值。
否则,如果[i] 中包含的值等于[i-1] ,则将存储在prev_rank 变量中的值分配给该位置,然后递增存储在rank 变量中的值。

输出的屏幕截图
总结
我们已经学习了如何创建一个数据库,一个集合,如何向其中插入数据,以及查询结果。此外,我们还研究了如何使用MongoDB中的数组对记录进行排序。
希望你能得到一些有用的见解。