初尝 mongodb+node.js

本文详细介绍了在Windows环境下MongoDB的安装步骤、错误处理方法、数据库操作命令及Node.js访问MongoDB的方法。涵盖创建数据库、数据增删改查、条件筛选等关键操作。

前言:你们这些不好好写接口的后台,非要逼着前端一统天下。纯属开玩笑哈,第一次写跟后台相关的东西,当揭开后台神秘的面纱的时候,那种惊喜、开心、成就感让我重回当初写出第一个hello world的时候。

由于我是用的是win10系统就以windows为基础说啊,linux和mac os的自行解决哈,不过应该也是大同小异的。

1. 安装

mongodb的下载和安装就不说了啊,还没有下载安装的自行去Mongodb 官网下载安装即可。

2.创建data 

这部分内容主要参考 NodeJS+Express+MongoDB 的文章,我主要说一下踩到的坑和遇到的错误处理

安装好之后,在根目录下创建data文件夹,我是放在e盘里的。

e:\data\db用于存放mongodb的数据文件

e:\data\log用于存放mongodb的日志文件

  错误处理

    1. 使用net start mongodb命令启动MongoDB服务发生系统错误,返回值为5

      解决方法:cmd使用管理员身份打开即可,到C:\Windows\System32找到cmd.exe然后以管理员的身份运行。为了避免每次启  动都要查找一次cmd文件,我把cmd放在了开始菜单里,右键固定在开始菜单就好了。

    2. 使用net start mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。

      解决方法:MongoDB安装目录\data\将此文件夹下的mongod.lock删除,我没有遇到这个问题,也不知道能不能正确解决,有踩过坑的可以说一下。

    3. 使用net stop mongodb命令启动mongodb系统出错。 发生系统错误 1067。 进程意外终止。

      我在start的时候是正常启动的,但是在stop的时候报错了,但是最后还是正常stop了,上面所说的mongod.lock或者mongod.cfg我都没有,也不知道如何解决,知道怎么解决的大佬还请赐教,谢谢,鞠躬鞠躬!

    注:解决了之后一定要重启服务才会生效哦。

3.启动 

还是继续参考上一边文章
    1.命令行
    ## 开始服务
    net start mongodb

    ## 停止服务 nginxstop并不会关闭服务,需要使用kill,事实证明win10下stop是可以正常停止服务的
    net stop mongodb

    2.在mongodb的安装目录下,E:\Program Files\MongoDB\Server\3.4\bin 下的mongo.exe文件 ,也可以放在开始里面,右键固定在开始菜单就好了

    3.可视化工具robomongo

        下载传送门    选择 Robo 3T 即可,选择第二个绿色版本即可,下载下来解压直接运行.exe文件就可以了,当然了这个也可以放在开始,右键固定在开始菜单就好了。

Robo 3T 下载截图

4.管理员  

参考 NodeJS入门——准备工作(2)——MongoDB安装以及客户端Robomongo安装和使用
    1.重新打开一个命令行窗口,切换到Mongodb安装路径下bin文件夹内
    2.输入命令: mongo,输入命令 use  admin切换到admin数据库
    3.输入命令  db.addUser('admin','admin')  添加管理员账户 这是以前的版本
    新版本应使用 ad.createUser({user:"admin",pwd:"admin",roles:[]})  

    新版本的命令参考

5.数据库操作

使用robo3T robomongo工具
    1.创建和删除数据库
        可以使用图形界面右键create database创建数据库,右键Drop Database删除数据库
        也可以使用命令行来操作:
            1.创建数据库gomall:  use gomall    
                                  db
            2.删除数据库gomall:use gomall
                                db.dropDatabase()
    2.数据库操作命令:
        先打开shell脚本编写界面
        1.insert:
            命令:db.表名.insert(数据); 
            例子:db.products.insert({name:"iphone",price:1988});
            说明:insert操作会自动创建products表,_id,是mongodb自已生成的,每行数据都会存在,默认是ObjectId,可以在插入数据时插入这个键的值(支持mongodb支持的所有数据类型)
            查看数据:db.getCollection('products').find({});
            3.2 版本后还有以下几种语法可用于插入文档:
            db.collection.insertOne():向指定集合中插入一条文档数据
            db.collection.insertMany():向指定集合中插入多条文档数据
        2.save
            命令:db.表名.save.(数据);
            例子:db.proctus.save({_id:2,name:"HuaWei P10",price:2999});
            说明:_id可以自已插入、一个表中不一定要字段都相同,虽然insert和save方法都可以插入数据,当默认的“_id”值已存在时,调用insert方法插入会报错;而save方法不会,会更新相同的_id所在行数据的信息。
        3.批量添加
            for(var i = 0; i < 5; i ++) db.users.save({'_id':i,'name':'zhangguo'+i,'age':i+8});
            for(let i = 0; i < 5; i ++) db.users.save({'_id':i,'name':`zhangguo${i}`,'age':i+8});
        4.查询数据
            1.查询集合中所有数据
                命令: db.集合.find();
                例子:db.users.find({name:'zhangguo0'});
                     db.getCollection('users').find({}); 
                     db.users.find({});
                     db.users.find();
                其中,例子的后面三种写法是相同的结果
            2.按条件查询(支持多条件)
                命令:db.集合.find(条件);
                例子:db.users.find({name:'zhangguo0',age:9})
                说明:对象中的条件要求同时成立
            3.查询第一条(支持条件)
                命令:db.集合.findOne(条件);
                例子:db.users.findOne({name:'zhangguo0'});
            4.限制数量
                命令: db.集合.find().limit(数量);
                例子: db.users.find({}).limit(3); 或 db.users.find().limit(3);  结果一样
            5.跳过指定数量
                命令: db.表名.find().skip(数量);
                例子: db.users.find({}).skip(3); 
                      db.users.find({}).skip(2).limit(2);
            6.比较查询

                 不同类型不会作比较,string和number不会作比较

                比较查询的语法参考


                1.等于:$eq
                    格式:{<key>:<value>}
                          {<key>:{$eq:<value>}}
                    例子:db.users.find({age:10});
                          db.users.find({age:{$eq:10}});
                    说明:这两种格式的结果是一样的
                2.大于: $gt 
                    格式:{<key>:{$gt:<value>}}
                    例子:db.users.find({age:{$gt:10}});
                3.大于等于: $gte
                    格式:{<key>:{$gte:<value>}}
                    例子:db.users.find({age:{$gte:10}});
                4.小于: $lt
                    格式:{<key>:{$lt:<value>}}
                    例子:db.users.find({age:{$lt:10}});
                5.小于等于: $lte
                    格式:{<key>:{$lte:<value>}}
                    例子:db.users.find({age:{$lte:10}});
                6.不等于: $ne
                    格式:{<key>:{$ne:<value>}}
                    例子:db.users.find({age:{$ne:10}});
            7.查询数量
                语法:db.表名.find().count();
                例子:db.users.find({}).count()
            8.排序
                 语法:db.表名.find().sort({"字段名":1});
                 例子:db.users.find({}).sort({}) 不能写成db.users.find({}).sort()会报错 "Failed to parse: sort: undefined. 'sort' field must be of BSON type object."
                            db.users.find({}).sort({age:-1,name:1});
                说明:1:表示升序;-1:表示降序;db.users.find({}).sort({}) 什么都不传按默认排序,默认是_id升序排序
           9.指定字段返回
                语法:db.表名.find({},{"字段名":0});
                例子:db.users.find({age:{$gt:9}},{_id:0,age:1,name:1});
                说明: 参数 1:返回 0:不返回
        5.修改
            1.修改符合条件的第一条:update
                语法:db.集合.update({"条件字段名":"字段值"},{$set:{"要修改的字段名":"修改后的字段值"}});
                例子:db.users.update({age:{$eq:9}},{$set:{age:100}});
                      db.users.update({age:9},{$set:{age:100}});
                说明:这两种格式的例子结果是一样的。前面save在_id字段已存在是就是修改操作。
            2.修改多条:updateMany
                例子: db.users.updateMany({age:{$gt:10}},{$set:{age:20}});
        6.删除
            语法:db.集合.remove(条件);
            例子:db.users.remove({age:{$gte:10}});  // 删除年龄>=10岁的数据

6.node.js访问Mongodb

    前提:先用nodejs新建一个简单的项目

    在当前项目中引入mongodb,可以不用全局安装的。

       npm install mongodb --save

    在项目的根目录下新建一个db.js文件,使用Node.js操作MongoDB。写完之后运行 node db.js 即可。

下面附上Node.js操作MongoDB的完整代码。主要主义的点是2.x和3.0以上的版本api接口有一点出入

// 引入客户端mongodb模块,获得客户端对象
const MongoClient = require('mongodb').MongoClient;
// 连接字符串
const DB_CONN_STR = 'mongodb://localhost:27017/gomall';

// 添加数据
const insertData = function (db, callback) {
  // 获得指定的集合
  let collection = db.collection('users');
  // 插入数据
  let data = [{
    _id: 9,
    name: 'rose',
    age: 23
  }, {
    _id: 10,
    name: 'mark',
    age: 24
  }];

  // collection.insert(data, function (err, result) {  // mongodb 2.x的写法 
  collection.insertMany(data, function (err, result) {
    // 如果存在错误
    if (err) {
      console.error('Error:', err);
      return;
    }

    // 调用传入的回调方法,将操作结果返回
    callback(result);
  });
}

// 修改数据
const updateData = function (db, callback) {
  // 获得指定的集合
  let collection = db.collection('users');
  // 要修改数据的条件,>=10岁的用户
  let where = {
    age: {
      $gte: 10
    }
  };
  // 要修改的结果
  let set = {
    $set: {
      age: 95
    }
  };

  collection.updateMany(where, set, function (err, result) {
    // 如果存在错误
    if (err) {
      console.error('Error:', err);
      return;
    }
    // 调用传入的回调方法,将操作结果返回
    callback(result);
  })
}

// 查询数据
const findData = function (db, callback) {
  let collection = db.collection('users');
  let where = {
    age: {
      $eq: '22'
    }
  };
  let set = {
    name: 1,
    age: 1
  };

  collection.find(where, set).toArray(function (err, result) {
    if (err) {
      console.error('Error:', err);
      return;
    }
    callback(result);
  });

  // 删除数据
  const deleteData = function (db, callback) {
    let collection = db.collection('users');
    let where = {
      age: {
        $eq: '21'
      }
    };
    collection.remove(where, function (err, result) {
      if (err) {
        console.error('Error:', err);
        return;
      }
      console.log(result);
      callback(result);
    })
  }



}

//使用客户端连接数据,并指定完成时的回调方法
// MongoClient.connect(DB_CONN_STR, function (err, db) {  // 2.x的写法
MongoClient.connect(DB_CONN_STR, {
  useNewUrlParser: true
}, function (err, client) { //// 3.0的写法
  if (err) {
    console.error('数据库连接失败');
    return;
  }
  console.log('连接成功');
  // 执行插入数据操作,调用自定义方法
  let db = client.db('gomall'); // 3.0的写法
  insertData(db, function (result) {
    // 显示结果
    console.log(result);
    // 关闭数据库
    client.close();
  });

  updateData(db, function (result) {
    // 显示结果
    console.log(result);
    client.close();
  });

  findData(db, function (result) {
    console.log(result);
    client.close();
  });
  deleteData(db, function (result) {
    console.log(result);
    client.close();
  })
});

原文地址

感谢:

1. https://www.cnblogs.com/best/p/6212807.html

2.https://www.cnblogs.com/zhaord/p/4229001.html

3.https://blog.youkuaiyun.com/u010523770/article/details/54599548

4.http://www.runoob.com/mongodb/mongodb-query.html

是你们在我黑暗的路上打开了一盏路灯,谢谢!

以上就是我的踩坑记录,愿对你也有所帮助。

愿圣光与你同在

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值