MongoDB 从入门到精通

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

MongoDB 是很重要的一个数据库,在本文中。将会看到如下内容: 什么是 MongoDB MongoDB 的安装 MongoDB 集合操作 MongoDB 文档操作 MongoDB 高级查询 Nod…

MongoDB 是很重要的一个数据库,在本文中。将会看到如下内容:

  1. 什么是 MongoDB
  2. MongoDB 的安装
  3. MongoDB 集合操作
  4. MongoDB 文档操作
  5. MongoDB 高级查询
  6. Node.js 使用 MongoDB
  7. 总结


什么是 MongoDB

MongoDB 是由 C++ 编写的一个数据库,是一个分布式超出的开源数据库系统。在高负载的情况下,表现的成绩要比 MySql 更好,MongoDB 可以为 WEB 应用提供可扩展的高性能数据库解决方案。MongoDB 将数据存储为一个文档,数据结构是由键值对组成的,MongoDB 文档类似于 JSON 对象,字段值可以包含其他文档,数组或者其他文档数据。

其具有以下的特点:

  • MongoDB 是一个面向对象的数据库,操作起来更加的快。
  • 可以在 MongoDB 中记录任何属性的索引,实现更快的排序。
  • 可以在本地或者网络中创建镜像。
  • 如果负载增加,可以在分布式计算机中增加更多的分片。
  • MongoDB 支持丰富的表达式,查询指令可以使用 JSON 完成标记,可以在文档中查询对象和数组。
  • MongoDB 可以使用 update 命令实现替换完成的文档,或者指定一些数据字段。
  • MongoDB 中 Map 和 reauce 主要用来对数据进行处理。
  • Map 函数和 Reduce 都是由 Js 编写而成的。
  • GridFS 是 MongoDB 中内置的一个功能,可以存储小文件。
  • MongoDB 允许在服务端执行脚本,可以用 Js 编写某个函数,直接在服务器端执行。
  • MongoDB 支持各种编程语言。
  • MongoDB 安装相当简单。

MongoDB 安装

Windows

进入地址,下载 MongoDB:

https://www.mongodb.com/download-center/community

在这里插入图片描述

下载完成文件,按照操作步骤直接安装即可。

若要运行 MongoDB,需要打开 PowerShell 执行以下命令:

C:\\mongodb\\bin\\mongod --dbpath c:\\data\\db

若执行成功,将会输出以下内容:

2015-09-25T15:54:09.212+0800 I CONTROL  Hotfix KB2731284 or later update is notinstalled, will zero-out data files2015-09-25T15:54:09.229+0800 I JOURNAL  [initandlisten] journal dir=c:\\data\\db\\journal2015-09-25T15:54:09.237+0800 I JOURNAL  [initandlisten] recover : no journal files present, no recovery needed2015-09-25T15:54:09.290+0800 I JOURNAL  [durability] Durability thread started2015-09-25T15:54:09.294+0800 I CONTROL  [initandlisten] MongoDB starting : pid=2488 port=27017 dbpath=c:\\data\\db 64-bit host=WIN-1VONBJOCE882015-09-25T15:54:09.296+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R22015-09-25T15:54:09.298+0800 I CONTROL  [initandlisten] db version v3.0.6

若要进入 MongoDB,需要输入如下命令,进入 MongoDB 命令行界面。

C:\\mongodb\\bin\\mongo.exe

Linux

输入命令,下载相关的安装包。

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz    ### 下载

解压:

tar -zxvf mongodb-linux-x86_64-ubuntu1604-4.2.8.tgz                                    ### 解压

将解压包,拷贝到执行目录。

mv mongodb-src-r4.2.8  /usr/local/mongodb4                          ### 将解压包拷贝到指定目录

将其添加到 PATH 目录中。

export PATH=<mongodb-install-directory>/bin:$PATH

创建相关目录,并初始化权限。

sudo mkdir -p /var/lib/mongosudo mkdir -p /var/log/mongodbsudo chown `whoami` /var/lib/mongo     ### 设置权限sudo chown `whoami` /var/log/mongodb   ### 设置权限

启动 MongoDB 服务。

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

若要进入 MongoDB,需要输入如下命令。

$ cd /usr/local/mongodb4/bin$ ./mongoMongoDB shell version v4.2.8connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodbImplicit session: session { \"id\" : UUID(\"2cfdafc4-dd56-4cfc-933a-187b887119b3\") }MongoDB server version: 4.2.8Welcome to the MongoDB shell.……

MongoDB 集合操作

查看集合

查看数据库中的集合。

>show collectionsteamsusers……

查看文档中所有集合的名称:

> db.getCollectionNames()[    \"teams\",    \"users\",    ……]

查看单个集合的名称。

> db.getCollection(\"users\")newDB.users

创建集合

使用 createCollection 创建集合

创建集合,使用下方的函数:

db.createCollection(name, options)
  • name:String,要创建的集合名
  • options:
    • capped:是否启用限制集合。
    • autoIndexID:是否自动创建索引字段
    • size:限制集合大小
    • max:允许最大文档数

例子:

> db.createCollection(\"student\"){ \"ok\" : 1 }
使用 insert 创建集合
> db.sites.insert({name:\"itbilu.com\"})WriteResult({ \"nInserted\" : 1 })> show collectionssitesstudentteamsusers……

集合重名名

db.COLLECTION_NAME.renameCollection(\"NEW_NAME\")

将 student 重命名为 students:

> db.student.renameCollection(\"students\"){ \"ok\" : 1 }> show collectionssitesstudentsteamsusers……

集合的删除

db.COLLECTION_NAME.drop()

删除 students 集合

> db.students.drop()true> show collectionssitesteamsusers……

MongoDB 文档操作

文档创建和数据插入

MongoDB 插入数据使用如下的 API:

db.tests.insert({\"foo\":\"foo\"})

插入多个数据,使用如下的 API:

db.tests.insert({\"_id\":0}, {\"_id\":1}, {\"_id\":0})

文档更新

修改 API 如下所示:

update(query, update)
文档替换

文档替换是用一个新文档,替换一个完全匹配的文档。

{ \"_id\" : 1, \"name\" : \"liuht\", \"blog\" : \"itbilu.com\" }

替换的语句如下所示:

db.tests.update({\'_id\':1}, {name:\'ht\'})

修改器使用

set 修改器

set 修改器用于指定一个字段的值,当字段不存在的时候,会自动进行添加该字段的值。

> db.tests.update({\'_id\':1}, { $set: { name:\'liuht\', age:30 }})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : \"liuht\", \"age\" : 30 }

修改错误,或者不在需要的字段,可以使用 unset 方法删除

> db.tests.update({\'_id\':1}, { $unset:{age:30}})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : \"liuht\" }

set 修改器,也可以用于修改内嵌文档

> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : { \"firstName\" : \"liu\", \"lastName\" : \"ht\" } }> db.tests.update({\'_id\':1}, { $set:{ \'name.lastName\':\'tt\' }})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : { \"firstName\" : \"liu\", \"lastName\" : \"tt\" } }
Inc 修改器

Inc 修改器,用于字段值的增加和减少。

{ \"_id\" : 1, \"name\" : \"liuht\", \"age\" : 30 }> db.tests.update({\'_id\':1}, { $inc:{ age: 1 }})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : \"liuht\", \"age\" : 31 }
添加元素

对于已经存在的数组元素,使用 push 修改器,向数组添加元素。

> db.tests.update({\'_id\':1}, { $push:{ firends: \'sandy\' }})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : \"liuht\", \"age\" : 31, \"firends\" : [ \"sandy\" ] }

如果需要向数据添加多个值,可以使用 each 配合 push:

> db.tests.update({\'_id\':1}, { $push: {firends: { $each: [\'sandy\', \'andy\'] }}})> db.tests.find({ _id: 1}){ \"_id\" : 1, \"name\" : \"liuht\", \"age\" : 31, \"firends\" : [ \"sandy\", \"sandy\", \"andy\" ] }

如果希望数组元素是定长的,可以使用 slice 配合 push 修改器。

> db.tests.update({\'_id\':1}, { $push: {firends: {                                           $each: [\'sandy\', \'andy\'],                                          $slice: -10 }}})
数组元素删除

数组元素删除,可以使用 pop 删除一个元素。

//从末尾删除{ \'$pop\': { \'key\': 1 } }//从开头删除{ \'$pop\': { \'key\': -1 } }
数组元素修改

数组元素修改,可以使用 0 开始进行修改。

> db.blog.posts.findOne(){ \"_id\": 1,   \"content\": \"……\",  \"comments\": [    { \"comment\": \"one\",      \"author\": \"andy\" },    { \"comment\": \"two\",      \"author\": \"sandy\" },    { \"comment\": \"three\",      \"author\": \"cat\" }  ]}

文档删除

db.tests.remove()   //删除集中所有数据db.tests.remove({\"_id\":{$gt:10}})  //只有_id 大于 10 的文档才会删除

MongoDB 高级查询

基本查询

比较运算

等于

  • $lt:Less Than
  • $gt:Greater Than
  • $gte:Greater Than or Equal
  • $ne:Not Equal
### age 大于等于 18db.mycollection1.find( { age:{$gt: 18} } )
逻辑运算
db.mycollection1.find( {    $or: [        { age: {$gte: 20} },        { salary: {$gt: 5000} },        { job: \"HR\" }    ]} )
范围运算
db.mycollection1.find( {    age: {        $in: [10, 20, 30]    }} )
正则表达式
db.mycollection1.find( {    name: /^Ja\\w+$/} )### 或db.mycollection1.find( {    name: {        $regex: \"/^Jaso\\w?$\"    }} )
limit 和 skip
### 限定显示条数db.mycollection1.find().limit(数量)### 跳过指定第几条数据db.mycollection1.find().skip(2)### 混合使用db.mycollection1.find().limit(10).skip(3)
自定义函数查询
db.mycollection1.find( {    $where: function() {        return this.age >= 18;    }} )
投影
### 格式为:db.mycollection1.find(    {查询条件},    {显示与否的选项})### 如:db.mycollection1.find(    {},    { _id: 0, name: 1, age: 1 })
排序
db.mycollection1.find().sort({ name:1, age:-1 })
统计
db.mycollection1.find().count()db.mycollection1.count( {查询条件} )
消除重复
### 格式为:db.集合名.distinct( \"指定字段\", {查询条件} )### 如db.mycollection1.distinct(     \"job\",     { age: {$lt: 40} } )

管道聚合

在这里插入图片描述

常用的管道有:

  • $match:简单的根据条件过滤筛选
  • $group:将数据分组,一般配合一些统计函数,如$sum。
  • $project:修改 document 的结构。如增删改,或创建计算结果
  • $lookup
  • $unwind:将 List 列表类型的 Document 进行拆分
  • $sort
  • $limit
  • $skip

语法格式:

db.集合名.aggregate( [    {管道表达式 1},    {管道表达式 2},    {管道表达式 2}] )

例子:

db.Orders.aggregate( [    {$match: {        status: \"A\"    } },    {$group: {        _id: \"$cut_id\",        total: { $sum: \"$amount\" }    } }] )

Node.js 使用 MongoDB

安装 Express 框架:

npm install express-generator -g

初始化项目:

$ express testmongodb// 初始化一个项目

安装相关依赖:

cd testmongodbnpm install

启动项目:

npm start

更改目录结构:

| bin| modle    - db.js| config    - config.js| views| public| routes    - index.js| app.js| package.json

安装 MongoDB:

npm install mongodb ---save

配置相关依赖:

// config.jsvar baseUrl = \"mongodb://localhost:27017\";var dbbase = \"/mongodb_demo\"; // 这里是我的数据库名称哦module.exports = {  \"dburl\": baseUrl + dbbase};

对数据库操作:

// db.js/** *  数据库封装 *  */var MongodbClient = require(\'mongodb\').MongoClientvar assert = require(\'assert\')var config = require(\'../config/config.js\')/** * 连接数据库 */function __connectDB(callback) {  MongodbClient.connect(config.dburl, function (err, db) {    callback(err, db)  })}/** * 插入一条数据 * @param {*} collectionName 集合名 * @param {*} Datajson 写入的 json 数据 * @param {*} callback 回调函数 */function __insertOne(collectionName, Datajson, callback) {  __connectDB(function (err, db) {    var collection = db.collection(collectionName);    collection.insertOne(Datajson, function (err, result) {      callback(err, result); // 通过回调函数上传数据      db.close();    })  })}/** * 查找数据 * @param {*} collectionName 集合名 * @param {*} Datajson 查询条件 * @param {*} callback 回调函数 */function __find(collectionName, JsonObj, callback) {  var result = [];  if (arguments.length != 3) {    callback(\"find 函数必须传入三个参数哦\", null)    return  }  __connectDB(function (err, db) {    var cursor = db.collection(collectionName).find(JsonObj);    if (!err) {      cursor.each(function (err, doc) {        assert.equal(err, null) // 使用 node 的 assert 模块来判断是否出错了        // 如果出错了,那么下面的也将不会执行了        if (doc != null) {          result.push(doc)        } else {          callback(null, result)          db.close();        }      })    }  })}/** *  * 删除数据(删除满足条件的所有数据哦) * @param {*} collectionName 集合名 * @param {*} json 查询的 json 数据 * @param {*} callback 回调函数 */function __DeleteMany(collectionName, json, callback) {  __connectDB(function (err, db) {    assert.equal(err, null)    //删除    db.collection(collectionName).deleteMany(      json,      function (err, results) {        assert.equal(err, null)        callback(err, results);        db.close(); //关闭数据库      }    );  });}/** * 修改数据 * @param {*} collectionName 集合名 * @param {*} json1 查询的对象 * @param {*} json2 修改 * @param {*} callback 回调函数 */function __updateMany(collectionName, json1, json2, callback) {  __connectDB(function (err, db) {    assert.equal(err, null)    db.collection(collectionName).updateMany(      json1,      json2,      function (err, results) {        assert.equal(err, null)        callback(err, results)        db.close()      }    )  })}/** * 获取总数 * @param {*} collectionName 集合名 * @param {*} json 查询条件 * @param {*} callback 回调函数 */function __getCount(collectionName, json, callback) {  __connectDB(function (err, db) {    db.collection(collectionName).count(json).then(function (count) {      callback(count)      db.close();    })  })}/** * 分页查找数据 * @param {*} collectionName 集合名 * @param {*} JsonObj 查询条件 * @param {*} C 【可选】传入的参数,每页的个数、显示第几页 * @param {*} C  callback */function __findByPage(collectionName, JsonObj, C, D) {  var result = []; //结果数组  if (arguments.length == 3) {      //那么参数 C 就是 callback,参数 D 没有传。      var callback = C;      var skipnumber = 0;      //数目限制      var limit = 0;  } else if (arguments.length == 4) {      var callback = D;      var args = C;      //应该省略的条数      var skipnumber = args.pageamount * args.page || 0;      //数目限制      var limit = args.pageamount || 0;      //排序方式      var sort = args.sort || {};  } else {      throw new Error(\"find 函数的参数个数,必须是 3 个,或者 4 个。\");      return;  }  //连接数据库,连接之后查找所有  __connectDB(function (err, db) {      var cursor = db.collection(collectionName).find(JsonObj).skip(skipnumber).limit(limit).sort(sort);      cursor.each(function (err, doc) {          if (err) {              callback(err, null);              db.close(); //关闭数据库              return;          }          if (doc != null) {              result.push(doc); //放入结果数组          } else {              //遍历结束,没有更多的文档了              callback(null, result);              db.close(); //关闭数据库          }      });  });}module.exports = {  __connectDB,  __insertOne,  __find,  __DeleteMany,  __updateMany,  __getCount,  __findByPage}// db.js 文件是数据库操作的 DAO 层的封装

配置 app.js:

//app.jsvar createError = require(\'http-errors\');var express = require(\'express\');var path = require(\'path\');var cookieParser = require(\'cookie-parser\');var logger = require(\'morgan\');var indexRouter = require(\'./routes/index\');var usersRouter = require(\'./routes/users\');// 修改【1】 global.db = require(\'./modle/db.js\')    // 引入数据库封装好的 DAO 层方法 var app = express();// view engine setupapp.set(\'views\', path.join(__dirname, \'views\'));app.set(\'view engine\', \'jade\');app.use(logger(\'dev\'));app.use(express.json());app.use(express.urlencoded({ extended: false }));app.use(cookieParser());app.use(express.static(path.join(__dirname, \'public\')));// 修改【2】 这里配置我们的路由app.use(\'/\', indexRouter)app.use(\'/users\', usersRouter)app.use(\'/testconnect\', indexRouter)app.use(\'/testdeletemany\', indexRouter)app.use(\'/testupdatemany\', indexRouter)app.use(\'/count\', indexRouter)app.use(\'/testfingbypage\', indexRouter)// catch 404 and forward to error handlerapp.use(function(req, res, next) {  next(createError(404));});// error handlerapp.use(function(err, req, res, next) {  // set locals, only providing error in development  res.locals.message = err.message;  res.locals.error = req.app.get(\'env\') === \'development\' ? err : {};  // render the error page  res.status(err.status || 500);  res.render(\'error\');});module.exports = app;

配置 index.js:

// index.js// 这里用来配置路由操作var express = require(\'express\');var router = express.Router();/* GET home page. */router.get(\'/\', function (req, res, next) {  res.render(\'index\', { title: \'Express\' });});// 测试数据库连接router.get(\'/testconnect\', function (req, res) {  global.db.__connectDB(function (err, db) {    if (err) {      console.log(err)      return    }    console.log(db)    res.render(\'index\', { title: \'连接数据库成功\' })  })})// 测试插入数据router.get(\'/testinsert\', function (req, res) {  global.db.__insertOne(\'student\', {    \"name\": \"binge\",    \"age\": 26,    \"interests\": [\'play\'],    \"sex\": \"男\"  }, function (err, result) {    if (!err) {      console.log(result)      res.render(\'index\', { title: \'插入一条数据成功\' })    } else {      console.log(err)    }  })})// 查找数据router.get(\'/testfind\', function (req, res) {  global.db.__find(\'student\', { age: { $lt: 30 } }, function (err, result) {    if (!err) {      console.log(result)      res.render(\'index\', { title: \'查询成功\' })    } else {      console.log(err)    }  })})// 删除数据(删除符合条件的全部数据哦)router.get(\'/testdeletemany\', function (req, res) {  global.db.__DeleteMany(\'student\', { \"age\": { $gte: 19 } }, function (err, result) {    if (!err) {      console.log(result)      res.render(\'index\', { title: \'删除成功\' })    } else {      console.log(err)    }  })})// 修改数据(满足条件的数据全部都会被修改)router.get(\'/testupdatemany\', function (req, res) {  global.db.__updateMany(    \'student\',    {      \"name\": \"binge\"    },    {      $set: { name: \"binge1\" }    },    function (err, result) {      if (!err) {        console.log(result)        res.render(\'index\', {          title: \'修改成功\'        })      }    }  )})// 统计总数router.get(\'/count\', function (req, res) {  global.db.__getCount(\'student\', {}, function (count) {    console.log(count)    res.render(\'index\', {      title: `一共${count}条数据`    })  })})// 分页显示// page 是页数,从 0 开始router.get(\'/testfingbypage\', function (req, res) {  global.db.__findByPage(\'student\', {}, {    \"pageamount\": 6,    \"page\": 0  }, function (err, result) {    if (err) {      throw err;    }    res.send(result);    console.log(result.length);  })})module.exports = router;

启动项目:

npm start

总结

在本文中,讲解了什么是 MongoDB、MongoDB 的安装、MongoDB 的集合操作、MongoDB 的文档操作、MongoDB 的高级查询、Node.js 使用 MongoDB。

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。