MongoDB 使用总结

MongoDB 是免费开源的跨平台 NoSQL 数据库,非关系数据库。与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储。

非关系数据库和关系型数据库的区别是什么?

  • 实质:非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版,通过 减少用不到或很少用的功能,来大幅度提高产品性能。
  • 价格:目前的非关系型数据库基本都是免费的,而比较有名气的关系型数据库都是收费的,比如:Oracle、DB2、MSSQL。MySql虽然是免费的,但是处理大型数据还是要提前作很多工作的。
  • 功能:实际开发中,很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是更明智的选择。

安装 MongoDB

官网下载

运行MongoDB服务端:

启用服务的命令是:mongod
通过 shell 连接 MongoDB 服务:mongo

1.打开命令行:先打开运行(快捷键win+R),然后输入cmd后回车,就可以打开命令行工具。
2.执行mongod:在命令中直接输入mongod,但是你会发现服务并没有启动,报了一个exception,服务停止了。
3.新建文件夹:出现上边的错误,是因为我们没有Mongodb需要的文件夹,一般是安装盘的根目录,建立data/db,这两个文件夹。
4.运行mongod:这时候服务就可以开启了,链接默认端口是27017

Mongo基本命令

查看存在数据库命令:show dbs

查看数据库版本命令:db.version()

use admin: 进入数据,成功会显示:switched to db admin

show collections: 显示数据库中的集合。
db:显示当前位置。

创建集合

MongoDB 创建数据库的语法格式如下:

1
use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

删除集合

语法:

1
db.collection.drop()

返回值

如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

插入文档

语法:

1
db.COLLECTION_NAME.insert(document)

例:

1
db.user.insert({"name":"frank","age":18})
2
WriteResult({ "nInserted" : 1 }) // 插入成功

查询文档

语法:

1
db.collection.find(query, projection)

参数:

  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。

例:

1
db.user.find()
2
{"_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 18}

更新文档

语法:

1
db.collection.update(
2
   <query>,
3
   <update>,
4
   {
5
     upsert: <boolean>,
6
     multi: <boolean>,
7
     writeConcern: <document>
8
   }
9
)

参数:

  • query : update的查询条件,类似sql update查询内where后面的。
  • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的
  • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参+ 数为true,就把按条件查出来多条记录全部更新。
  • writeConcern :可选,抛出异常的级别。

我们把上一条数据的 age 改成 20

1
db.user.update({"name":"frank"},{"name":"frank","age":20})
2
db.user.find()
3
{ "_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 20 }

删除文档

语法:

1
db.collection.remove(
2
   <query>,
3
   <justOne>
4
)

参数:

  • query :(可选)删除的文档的条件。
  • justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
  • writeConcern :(可选)抛出异常的级别。

例:

1
db.user.remove({"name":"frank"})
2
WriteResult({ "nRemoved" : 1 }) // 删除成功

删除数据库

db.dropDatabase( ):删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。

Mongoose

Mongoose是设计用于异步环境的MongoDB对象建模工具。

安装

1
npm install mongoose

连接数据库

1
const mongoose = require('mongoose');
2
 
3
mongoose.connect('mongodb://localhost/my_database', {
4
  useNewUrlParser: true,
5
  useUnifiedTopology: true
6
});

Schema

1
const Schema = mongoose.Schema;
2
 
3
const userModel = new Schema({
4
    username: { type: String, required: true },
5
    password: { type: String, required: true },
6
    email: String
7
});

Model

1
var User = mongoose.model('userModel', userModel );

插入数据

1
User.insertMany({ username: 'frank', password: 123123, email: '123456@163.com' })
2
    .then(data => {
3
        console.log(data)
4
        console.log('插入成功')
5
    }).catch(err => {
6
        console.log(err)
7
    })

查询数据

1
User.find().then((data) => {
2
    console.log(data)
3
});

修改数据

‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.

1
User.update({ username: "frank" }, { $set: { username: "frank1" } }).then(() => {
2
    console.log('修改成功')
3
})

‘$inc’增减修改器,只对数字有效.

1
Model.update({
2
  'age': 22
3
 }, {
4
  '$inc': {
5
    'age': 1
6
  }
7
 });
8
// age = 23

‘$unset’ 同上取反,删除一个键

1
 Model.update({
2
  'age': 22
3
 }, {
4
  '$unset': {
5
    'age': '123'
6
  }
7
 });
8
// 执行后: age键不存在

‘$push’ 给一个键push一个数组成员,键不存在会创建

1
 Model.update({
2
  'age': 22
3
}, {
4
  '$push': {
5
    'array': 10
6
  }
7
});
8
// 执行后: 增加一个 array 键,类型为数组, 有一个成员 10

‘$addToSet’ 向数组中添加一个元素,如果存在就不添加

1
Model.update({
2
  'age': 22
3
}, {
4
  '$addToSet': {
5
    'array': 10
6
  }
7
});
8
// 执行后: array中有10所以不会添加

‘$each’ 遍历数组, 和 $push 修改器配合可以插入多个值

1
Model.update({
2
  'age': 22
3
}, {
4
  '$push': {
5
    array': {
6
      '$each': [1, 2, 3, 4, 5]
7
    }
8
  }
9
});
10
// 执行后: array : [10,1,2,3,4,5]

‘$pop’ 向数组中尾部删除一个元素

1
Model.update({
2
  'age': 22
3
}, {
4
  '$pop': {
5
    'array': 1
6
  }
7
});
8
// 执行后: array : [10,1,2,3,4]  tips: 将1改成-1可以删除数组首部元素

‘$pull’ 向数组中删除指定元素

1
Model.update({
2
  'age': 22
3
}, {
4
  '$pull': {
5
    'array': 10
6
  }
7
});
8
// 执行后: array : [1,2,3,4]  匹配到array中的10后将其删除

删除数据

1
User.remove().then(() => {
2
    console.log('删除成功')
3
})

删除一条数据

1
User.deleteOne().then(() => {
2
    console.log('删除成功')
3
})