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 创建数据库的语法格式如下:
use DATABASE_NAME
如果数据库不存在,则创建数据库,否则切换到指定数据库。
删除集合
语法:
db.collection.drop()
返回值
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
插入文档
语法:
db.COLLECTION_NAME.insert(document)
例:
db.user.insert({"name":"frank","age":18})
WriteResult({ "nInserted" : 1 }) // 插入成功
查询文档
语法:
db.collection.find(query, projection)
参数:
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
例:
db.user.find()
{"_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 18}
更新文档
语法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参+ 数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
我们把上一条数据的 age 改成 20
db.user.update({"name":"frank"},{"name":"frank","age":20})
db.user.find()
{ "_id" : ObjectId("5db29925da796623a4bfb583"), "name" : "frank", "age" : 20 }
删除文档
语法:
db.collection.remove(
<query>,
<justOne>
)
参数:
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
- writeConcern :(可选)抛出异常的级别。
例:
db.user.remove({"name":"frank"})
WriteResult({ "nRemoved" : 1 }) // 删除成功
删除数据库
db.dropDatabase( ):删除整个数据库,在删除库时,一定要先进入数据库,然后再删除。
Mongoose
Mongoose是设计用于异步环境的MongoDB对象建模工具。
安装
npm install mongoose
连接数据库
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/my_database', {
useNewUrlParser: true,
useUnifiedTopology: true
});
Schema
const Schema = mongoose.Schema;
const userModel = new Schema({
username: { type: String, required: true },
password: { type: String, required: true },
email: String
});
Model
var User = mongoose.model('userModel', userModel );
插入数据
User.insertMany({ username: 'frank', password: 123123, email: '123456@163.com' })
.then(data => {
console.log(data)
console.log('插入成功')
}).catch(err => {
console.log(err)
})
查询数据
User.find().then((data) => {
console.log(data)
});
修改数据
‘$set’ 指定一个键的值,这个键不存在就创建它.可以是任何MondoDB支持的类型.
User.update({ username: "frank" }, { $set: { username: "frank1" } }).then(() => {
console.log('修改成功')
})
‘$inc’增减修改器,只对数字有效.
Model.update({
'age': 22
}, {
'$inc': {
'age': 1
}
});
// age = 23
‘$unset’ 同上取反,删除一个键
Model.update({
'age': 22
}, {
'$unset': {
'age': '123'
}
});
// 执行后: age键不存在
‘$push’ 给一个键push一个数组成员,键不存在会创建
Model.update({
'age': 22
}, {
'$push': {
'array': 10
}
});
// 执行后: 增加一个 array 键,类型为数组, 有一个成员 10
‘$addToSet’ 向数组中添加一个元素,如果存在就不添加
Model.update({
'age': 22
}, {
'$addToSet': {
'array': 10
}
});
// 执行后: array中有10所以不会添加
'push 修改器配合可以插入多个值
Model.update({
'age': 22
}, {
'$push': {
array': {
'$each': [1, 2, 3, 4, 5]
}
}
});
// 执行后: array : [10,1,2,3,4,5]
‘$pop’ 向数组中尾部删除一个元素
Model.update({
'age': 22
}, {
'$pop': {
'array': 1
}
});
// 执行后: array : [10,1,2,3,4] tips: 将1改成-1可以删除数组首部元素
‘$pull’ 向数组中删除指定元素
Model.update({
'age': 22
}, {
'$pull': {
'array': 10
}
});
// 执行后: array : [1,2,3,4] 匹配到array中的10后将其删除
删除数据
User.remove().then(() => {
console.log('删除成功')
})
删除一条数据
User.deleteOne().then(() => {
console.log('删除成功')
})
网友评论