在Node中操作MongoDB数据库(一):mongodb

您好,我是沧沧凉凉,是一名前端开发者,目前在掘金知乎以及个人博客上同步发表一些学习前端时遇到的趣事和知识,欢迎关注。


在写一些个人项目中,或者一些爬虫,一些工具一些脚本中,总会有存储数据的需求,而通过Node,作为一个前端也是可以使用JS编写简单的后端项目的。

在Node项目中,经常会使用MongoDB来做数据库,因为Node服务一般都是小型的服务,并且JS它是单线程,所以无法最大化发挥多核CPU的威力,所以大型服务还是得用Java或者C++这种静态语言进行编写。

就因为这种小型服务,所以使用MongoDB来做数据库就非常方便,不用建表不用写SQL语句,操作起来简单快捷,而且如果是较大的项目,后端这种东西还是交给专业的后端人员比较好。

阅读本篇文章之前,你首先需要了解MongoDB相关知识,至少得知道如何搭建一个MongoDB数据,当然这些知识并不在本篇文章的范围内。

当然你还得具有一部分的Node知识,因为浏览器环境下是没有办法访问数据库的,只有通过Node服务才能访问数据库。

连接

要连接数据库你首先得要有一个数据库,你有了数据库后就可以连接数据了:

MongoDB默认只支持本地连接,同时如果是生产环境下的数据,强烈推荐本地连接,不要开放数据库到外网环境中,一旦你将数据库开放到外网环境中,可能不怀好意的人会直接攻击你的数据库。

其实将电脑内网穿透出来,然后通过外网远程控制也是非常危险的,我记得前一段时间有一个大公司的员工将自己的电脑内穿出来,黑客攻击了他的电脑,并且顺带攻击了整个局域网的电脑。

我之前将电脑内网穿透时,由于连接密码设置的太过于简单,中了比特币病毒…电脑上面所有的文件都被锁了,最后的解决方法是重装了系统,将整个电脑硬盘进行了格式化。

不过这件事对我没有造成什么损失,因为我有个习惯是所有资料、代码都会存储到云端,存储到云端除了换电脑的时候很方便之外,还可以预防这种电脑中病毒的情况。

所以说将个人电脑暴露在公网中是一件非常危险的事情。

扯远了,下面我们来看一下如何通过mongodb这个库连接数据库。

const MongoClient = require("mongodb").MongoClient;
let url = "mongodb://localhost:27017";

MongoClient.connect(url).then((db) => {
  // 下面是对集合的操作,如果没有数据库和集合则会自动新增。
  const site = db.db("test").collection("age");
  
  // 数据库操作完毕后得关闭连接,不然Node服务不会退出。
  db.close();
});

mongodb的方法都支持Promise,所以我们可以直接通过.then进行链式调用。

插入单条数据

site.insertOne(obj).then(res=>{
  console.log(res)
  db.close();
})

插入多条数据

const obj = [
  { name: '菜鸟工具', url: 'https://c.runoob.com', type: 'cn'},
  { name: 'Google', url: 'https://www.google.com', type: 'en'},
  { name: 'Facebook', url: 'https://www.google.com', type: 'en'}
];

site.insertMany(obj).then(res=>{
  console.log(res)
  db.close()
})

res的返回值

{
  acknowledged: true,
  insertedCount: 3,
  insertedIds: {
    '0': new ObjectId("6142fe73ee5f5e6ce3c970a3"),
    '1': new ObjectId("6142fe73ee5f5e6ce3c970a4"),
    '2': new ObjectId("6142fe73ee5f5e6ce3c970a5")
  }
}

deleteOne():删除一条

如果要删除多条语句可以使用 deleteMany() 方法

删除集合

可以使用 drop() 方法来删除集合

更新一条数据updateOne

const whereStr = {"name":'菜鸟教程'};  // 查询条件
const updateStr = {$set: { "url" : "https://www.runoob.com" }};
site.updateOne(whereStr, updateStr).then((res) =>{
  console.log(res);
  db.close();
});

更新所有符合条的文档数据可以使用 updateMany()

也可以通过id来进行修改,

可以使用find()来查找数据,find()可以返回匹配条件的所有数据。 如果未指定条件,find()返回集合中的所有数据。

site.find({}).toArray().then(res=>{
  console.log(res);
  db.close()
})

排序

sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。

查询分页

要设置指定的返回条数可以使用limit()方法,该方法只接受一个参数,指定了返回的条数。

如果要指定跳过的条数,可以使用skip()方法。

最后

如果是脚本通过这种方式是非常方便的,但如果你要用Node创建一个服务,那么还是推荐用另一个库:mongoose,该库来做服务的话拥有数据类型等,安全性要比mongodb好上那么一些。