MongoDB
一. MongoDB 介绍:
MongoDB 是一个跨平台, 面向文档的数据库, 高性能, 高可用性和易于扩展
二三个概念
数据库: 数据库是一个集合的物理容器, 一个单一的 MongoDB 服务器通常有多个数据库
集合: 集合是一组 MongoDB 的文件简单理解就是一个数组
文档 : 文档是一组键值对 (可以认为是 json 格式, 但其实是 bson, bson 基于 json 格式) bson 和 json 的区别
[看图] {name : '哈哈'}
三为什么选择 MongoDB?
学习成本较低
和 Node.js 结合最好, 对 javascript 兼容较好
四官网链接:
英文官网 - https://www.mongodb.com/
中文官网 - https://www.mongodb.com/cn
菜鸟教程 - http://www.runoob.com/mongodb/mongodb-tutorial.html
五安装:
win 安装: ( 推荐下载安装 )
下载安装; RuanJain
演示下载哪一个: 下载官网
mac 安装 : ( 推荐在线安装 )
安装: home brew
/usr/bin / ruby - e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
测试 brew 安装是否成功:
brew -v
更新 brew
brew update
安装 MongoDB
brew install mongodb--with - openssl
检查:
- mongo --version
- // 显示如下代表成功:
- MongoDB shell version v3.4.7
- ......
六 启动连接 mongodb 服务器: ( Win 版 )
win-mongodb 使用
mac-mongodb 使用
(一) 启动数据库 服务器:
创建目录 c:\data\db\
- 如果使用这个路径 `c:\data\db\\`, 就可以直接使用第二步,
- else
- 在启动的时候, 可以通过 --dbpath 指定数据服务存储数据的目录 // 目录可以通知点击地址栏获取
- mongod --dbpath D:\mongo-data
- 如果不加 --dbpath, mongod 会自动使用 ` 执行命令所属磁盘根目录 ` 下面的 / data/db 目录作为自己的数据存储路径,
在命令行输入 mongod 启动服务 (注意 : 不是 mongodb 也不是 mongo)
- > mongod // mac 下 要使用 sudo mongod
- // 如果出现瞎买这句话才算 OK
- > .... waiting for connections on port 27017
**[ 切记 ] ** 停止服务: 按 ctr + c, 不要直接通过关闭 cmd 窗口的方式来关闭
任务管理器 关闭进程
找到 mongod.lock 删掉
(二) 连接数据库 服务器:
再打开一个 cmd 窗口
通过 mongo 命令连接数据库服务器
mongo 命令默认去连接本机上的 MongoDB 服务实例: 127.0.0.1:27017
也可以通过下面的命令, 指定连接的主机名和端口号:
mongo--host 127.0.0.1--port 27017
(三) 操作数据库 服务器: {见基本操作命令}
七 开启连接 mongodb 服务器: ( Mac 版)
win-mongodb 使用
mac-mongodb 使用
(一) 启动数据库 服务器:
创建 /data/db 目录 ;
- // 代码执行
- sudo mkdir -p /data/db //sudo 提高权限 目录在 Finder / 左侧设备 / XXX/Machintosh/data/db
开启数据库服务器:
- // 开启
- sudo mongod
- else....
------------ 指定路径分割线 -----------
// 指定路径开启
1. 创建一个目录: mongodb-data
2. sudo mongod --dbpath [把文件夹直接拖进来]
- // 开启成功:--- 正确分割线 -----------
- : waiting for connections on port 27017
-------------- 错误分割线 -----------
- // 千万要注意: 一定要正常退出,, 不要直接 X 掉终端,, 没用的,, 下次开开启开不了, 用也用不了
- // 如果报错已经在 use : addr already use, 说明就是
- // 查看当前进程
- ps -aef | grep mongo
- // 显示
501 10576 6955 0 5:44 下午 ttys002 0:00.0 grep mongo
- // 杀掉进程: (不要杀 PID 是 1 的 -- 那是关机)
- sudo kill 6955
- // 杀到后, 找到 MacintoshHD 的 data/db 里面全部删掉, 再次重启:
sudo mongod 即可
[ 切记 ] 停止服务:
按 cmd + c, 不要直接通过关闭终端 窗口的方式来关闭
(二) 连接数据库 服务器:
再打开一个终端窗口
执行 mongo 命令, 连接数据库服务器
mongo 命令, 默认去连接本机上的 MongoDB 服务实例: 127.0.0.1:27017 {一定要记住这个端口号}
也可以通过下面的命令, 指定连接的主机名和端口号:
mongo--host 127.0.0.1--port 27017
提示: 如果提示 无法连接主机, 请检查你的 MongoDB 数据服务实例是否开启
(三) 操作数据库 服务器: {见基本操作命令}
总结:
开启数据库服务器: mongod / sudo mongod
连接....................: mongo
关闭....................: Ctr+C
八基本操作命令
1. 查看服务器里所有的数据库 : show dbs
- > show dbs
- admin 0.000GB
- hackernews 0.000GB
- local 0.000GB
- test1104 0.000GB
2. 切换 / 创建数据库 : use 数据库名称
如果在创建的数据库里, 不创建集合, 辣么, 退出后, 数据库也就消失了;
(简单了解即可) 连接到数据库之后, 默认有一个变量叫做: db, 终端默认把 db 赋值给了 test
- > use test1104
- switched to db test1104
3. 查看当前所处的数据库 : db
> db test1104 //(如果没有指定具体的数据库就会返回一个测试的: test)
4. 创建集合并插入一条 数据 :
db. 集合名称. insertOne(数据文档)
5. 创建集合并插入多条 数据 :
db. 集合名称. insertMany(数据文档)
如果没有集合就创建,
如果有集合, 就直接插入数据
- // 1. 插入一条
- > db.news.insertOne({id:1, title:"news title", url:"http://www.baidu.com", text:"百度一下, 你就知道"});
- > WriteResult({ "nInserted" : 1 }) // insert 成功
- // 2. 插入多条 [{},{},{}] 数组里有对象
- db.news01.insertMany([
- { title: "张三", url: 'www.zhangsan.com', text:'我是张三, 谁与我争雄'},
- { title: "李四", url: 'www.lisi.com', text:'我是李四, 我不爱女人, 只爱妖妖'},
- { title: "王五", url: 'www.wangwu.com', text:'我住隔壁, 我姓王'}
- ])
- > { // 插入多条成功
- "acknowledged" : true,
- "insertedIds" : [
- ObjectId("59fcc3f96208a88400da6d6e"),
- ObjectId("59fcc3f96208a88400da6d6f"),
- ObjectId("59fcc3f96208a88400da6d70")
- ]
- }
6. 查看当前数据库中所有的集合 : show collections
- > show collections
- aaa
- news
7. 查询该集合中的所有数据 :
db. 集合名称. find()
可以通过
db. 集合名称. find().pretty()
美化输出格式 (如果属性少就不会显示美化格式)
默认是查询所有, 可以通过:
db. 集合名称. find({查询条件})
按条件查询集合中的数据
8. 根据条件查询该集合某一条 / 多条数据:
db. 集合. find(条件)
[具体查询]
查看具体数据
- // gt: greate than
- // lt: less than
- // e: equal
- // ne: not equal
- > db.aaa.find({age:{$gte:18}}) // 查看 age >= 18 的
- { "_id" : ObjectId("59fcb97f6208a88400da6d65"), "name" : "xingge", "age" : 18 }
- { "_id" : ObjectId("59fcbee26208a88400da6d69"), "nage" : "huge", "age" : 19 }
9. 更新指定集合数据 :
db. 集合名称. update({更新条件},{$set:{要更新的字段}})
更新指定集合数据
满足一个条件的多个数据修改, 还要在后面添加 ,{multi:true}
- > db.aaa.update({age:18},{$set:{name:'xiaomage'}},{multi:true})
- WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) // 更新成功
- 10.
删除集合的某个文档 : db. 集合名称. remove({删除条件})
删除指定集合中的数据
11. 删除集合 :
db. 集合名称. drop()
参考文档: https://docs.mongodb.com/manual/crud/
参考文档: http://www.runoob.com/mongodb/mongodb-update.html (推荐)
九 Node.js 操作 MongoDB 使用 MongoDB 驱动器
这个 mongodb 是 MongoDB 驱动器 (driver) , 帮助 nodejs 来操作 mongo 数据库的, 虽然名字一样, 但是实质不一样
Quick Start 参考文档:
MongoDB - Quick Start > 找: Connect to MongoDB
npmj- Quick Start > 找: Connecting to MongoDB
菜鸟教程
安装:
- npm init -y // 初始化包配置文件
- npm i mongodb -SD // 安装
前提: 开启数据库服务器 : 终端开启 MongoDB 服务器 : 执行: mongod /
mongod - dbpath 新路径
如果是 mac 记得加 sudo: sudo mongod
检查是否操作成功: 可以打开 mongo 查看
CRUD [增删改查]
十 CRUD (增删改查)
连接数据库服务器:
- //1. 加载 mongodb
- var mongodb = require('mongodb')
- //2. 获取一个连接数据库的对象 MongoClient
- var MongoClient = mongodb.MongoClient;
- //3. 连接字符换 连接到数据库进程 数据 db01 里
- // var url = 'http://127.0.0.1....'
- var url = 'mongodb://127.0.0.1:27017/db01'
- //4. 开始连接
- /// [注意] 一定要注意, 终端开启数据库服务器 sudo mongod
- MongoClient.connect(url,
- function(err, db) {
- if (err) {
- throw err
- }
- console.log('连接上了数据库');
- //5. 一定要关闭
- db.close()
- })
插入单条数据
使用方法: **db . collection(XX) . insertOne ( { 数据 } , callback(err,result) ) **
insert( {数据 }, callback ) 已经废弃
- //1. 插入单条数据
- // [注意 1] 插入数据是异步的 所以要有个回调函数
- // [注意 2] insert() 在 3.2 版本之后, 已经慢慢被废弃, 插入单条的话
- // 使用 insetOne()
- db.collection('heros').insertOne({name:'星哥',age:18}, function(err,doc){
- if (err) {
- throw err
- }
- console.log(doc)
- //{ result: { ok: 1, n: 1 },
- // ops: [ { name: '星哥', age: 18, _id: 59fd23fd2ae663070b66a4f7 } ],
- // insertedCount: 1,
- // insertedIds: [ 59fd23fd2ae663070b66a4f7 ] }
- //[注意] 取值之后, 一定要记得关闭数据库
- db.close()
- })
插入多条数据
使用方法 : insertMany ( [ { 数据 1 } , { 数据 2 }] , callback(err,result) )
- //2. 插入多条数据
- // [注意] 插入数据是异步的
- // 所以要有个回调函数
- db.collection('heros').insertMany([
- {name:'虎哥',age:80},
- {name:'达达',age:18},
- {name:'香香',age:19},
- ], function(err,doc){
- if (err) {
- throw err
- }
- console.log(doc)
- // { result: { ok: 1, n: 3 },
- // ops:
- // [ { name: '虎哥', age: 80, _id: 59fd24e2b28af807465884cc },
- // { name: '达达', age: 18, _id: 59fd24e2b28af807465884cd },
- // { name: '香香', age: 19, _id: 59fd24e2b28af807465884ce } ],
- // insertedCount: 3,
- // insertedIds:
- // [ 59fd24e2b28af807465884cc,
- // 59fd24e2b28af807465884cd,
- // 59fd24e2b28af807465884ce ] }
- //[注意] 取值之后, 一定要记得关闭数据库
- db.close()
- })
查询全部数据
使用方法 : find ( { 条件 } ) . toArray ( callback(err,docs) ) : 条件可有可无
打印的 doc: 是一个数组, (查询首页列表适合用)
- //5. 获取数据
- db.collection('heros').find().toArray(function(err, doc) {
- if (err) {
- throw err
- }
- // [查询多条的区别]
- // 1. find().toArray(callback)
- // 2. doc 是一个数据集合
- console.log(doc) db.close()
- })
- })
查询单条数据
使用方法 : findOne( {条件} , callback(err,doc) )
doc 打印的是一个 对象 : (查询某个详情页适合用)
- //5. 查询单条数据
- db.collection('heros').findOne({age:16},function (err,doc) {
- if (err) {
- throw err
- }
- console.log(doc)
- // 打印的是一个对象
- //{ _id: 59fd259fc83c80e709dff4dc, name: '老宫', age: 16 }
- // 异步里关闭数据库
- db.close()
- })
更新数据
使用方法: updateOne ( {条件} , { $set: {更新字段 }} , callback )
更新多条: updateMany
如果只跟新一条是用 $ set, 如果工作中的编辑页面是要获取所有的信息都要更新一遍的
所以, 直接写对象即可, 不用 $ set 了
- //5. 更新数据
- // update(参数 1, 参数 2, 回调)
- db.collection('heros').updateOne({age:16},{$set:{name:'丹丹'}},function (err,doc) {
- if (err) {
- throw err
- }
- console.log(doc)
- console.log('ok')
- db.close()
- })
删除数据
删除单条: deleteOne ( {条件} , callback )
删除多条: deleteMany ( {条件} , callback )
- //6. 删除
- // 删除多条 deleteMany()
- db.collection('heros').deleteOne({age:16},function (err,doc) {
- if (err) {
- throw err
- }
- console.log('删除成功')
- //6. 关闭数据库
- db.close();
- })
来源: http://www.jianshu.com/p/fb34dc7e6ecd