如何在Node.js中对MongoDB数据库的记录进行自定义排序

399 阅读6分钟

如何在Node.js中对MongoDB数据库的记录进行自定义排序

本文将为我们介绍如何对MongoDB数据库中的记录进行排序。我们将在sort() 函数中添加一些排序功能,以便给记录定位。

最后,我们将能够。

  • 使用Node Package Manager在Node.js应用程序中安装和配置MongoDB驱动程序。
  • 从MongoDb数据库查询和排序结果。
  • 使用数组为记录提供自定义排名。

前提条件

作为先决条件,读者必须具备。

  1. 对Node.js和MongoDB操作有基本了解。
  2. 在你的机器上安装了Node.js和MongoDB。

简介

在我们的日常生活问题中,我们在某一时刻需要对数据进行分类,以使我们对如何进行操作有更深入的了解。

例如,在学校设置中,我们需要分析学生的成绩,并根据他们的表现给予他们适当的职位。由于这个原因,我们总是要记住,两个或更多的人将会得到相同的分数或点数。

作为开发者,我们必须对系统进行编程,使学生获得相同的位置,而在他们之后的下一个学生则获得适当的递增的位置。

例如,对于这五个学生和他们的分数,我们将进行如下操作。

学生姓名积分位置
学生121POS 1
学生238POS 2
学生390POS 3
学生490POS 4
学生558POS 5

分类后。

学生姓名分数位置
学生390POS 1
学生490POS 1
学生558POS 3
学生238POS 4
学生121POS 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() ,使用rankArrayresults 进行排序。

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";
            }
    }
}

它有三个变量。

  1. rank - 它控制用于显示适当递增的位置的循环计数,例如, ,而不是 。1,1,3 1,1,2

我们把它初始化为1 ,因为我们从1 ,而不是0 开始索引位置。

  1. prev_rank - 在出现平局的情况下,前一等级用于显示等级位置。它存储了一个学生的当前位置 ,这样当循环递增到下一个位置 ,当前位置 被暂时存储。因此,当前位置被定为 ,下一个位置被定为 。如果在 找到的值与 相同, 只会被分配到上一个等级并被赋予下一个数组索引。它的第一个位置被分配为 。[i]``[i+1] [i] [i-1] [i] [i] [i-1] [i] 1
  2. position - 这存储了要显示的等级。我们把它初始化为 ,其中的初始化值并不重要,因为位置被分配在 内。你可以把它初始化为任何数字。0 for loop

for loop 包含一个if-else-if 结构,用于检查数值并适当地分配它们。

如果它是第一个索引,那么位置自动变成1

如果[i] 中包含的值不等于[i-1] ,则递增rank 的值并将其分配给position 。正如我们上面讨论的那样,prev_rank 再次分配给rank 的值。

否则,如果[i] 中包含的值等于[i-1] ,则将存储在prev_rank 变量中的值分配给该位置,然后递增存储在rank 变量中的值。

Screenshot

输出的屏幕截图

总结

我们已经学习了如何创建一个数据库,一个集合,如何向其中插入数据,以及查询结果。此外,我们还研究了如何使用MongoDB中的数组对记录进行排序。

希望你能得到一些有用的见解。