1.什么是mongodb
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2.安装mongodb
官网:https://www.mongodb.com/try/download/community
配置系统环境变量:
我的电脑-》右键选属性-》高级系统设置-》环境变量-》系统变量-》path-》编辑-》新建
Path:C:\Program Files\MongoDB\Server\4.4\bin\
创建数据库目录:
C:\mongodb\data
运行服务器:
mongod --dbpath C:\mongodb\data
连结服务器:
mongo
连结测试:
localhost:27017
3.基础语法
3.1.查看所有数据库
show dbs
3.2.创建数据库(连接数据库)
use test2\. #创建数据库(连接数据库)
db.addUser('name','pwd') #增加或修改用户密码
db.system.users.find()#查看用户列表
db.auth('name','pwd') #用户认证
db.removeUser('name') #删除用户
show users#查看所有用户
3.3.增删改查
db.user.insert({name: 'zhangsan', age: '18'})
db.user.remove({name: 'lisi'})
db.user.update({name: 'zhangsan'}, {name: 'lisi', age: '20'})
db.user.find()
4.查询条件的运算
4.1.比较运算
age大于等于18
db.mycollection1.find( { age:{$gt: 18} } )
可选比较运算符
: 等于
$lt: Less Than
$lte: Less Than or Equal
$gt: Greater Than
$gte: Greater Than or Equal
$ne: Not Equal
4.2.逻辑运算
$and
$or
db.mycollection1.find( {
$or: [
{ age: {$gte: 20} },
{ salary: {$gt: 5000} },
{ job: "HR" }
]
} )
4.3.范围运算
$in
$nin: Not In
$all
db.mycollection1.find( {
age: {
$in: [10, 20, 30]
}
} )
$all和$in类似,但是他需要匹配条件内所有的值:
如有一个对象:
{ a: [ 1, 2, 3 ] }
下面这个条件是可以匹配的:
db.things.find( { a: { $all: [ 2, 3 ] } } );
但是下面这个条件就不行了:
db.things.find( { a: { $all: [ 2, 3, 4 ] } } );
4.4正则表达式
db.mycollection1.find( {
name: /^Ja\w+$/
} )
# 或
db.mycollection1.find( {
name: {
$regex: "/^Jaso\w?$"
}
} )
4.5.limit和skip
db.mycollection1.find().limit(数量)
db.mycollection1.find().skip(2)
# 混合使用
db.mycollection1.find().limit(10).skip(3)
4.6. 自定义函数查询
自定义查询是指使用自定义函数,格式为$where: function(){...}
db.mycollection1.find( {
$where: function() {
return this.age >= 18;
}
} }
4.7.$size
$size是匹配数组内的元素数量的,如有一个对象:{a:["foo"]},他只有一个元素:
下面的语句就可以匹配:
db.things.find( { a : { $size: 1 } } );
官网上说不能用来匹配一个范围内的元素,如果想找$size<5之类的,他们建议创建一个字段来保存元素的数量。
4.8.exists用来判断一个元素是否存在:
db.things.find( { a : { $exists : true } } ); // 如果存在元素a,就返回
db.things.find( { a : { $exists : false } } ); // 如果不存在元素a,就返回
4.9.type 基于 bson type来匹配一个元素的类型,像是按照类型ID来匹配,不过我没找到bson类型和id对照表。
db.things.find( { a : { $type : 2 } } ); // matches if a is a string
db.things.find( { a : { $type : 16 } } ); // matches if a is an int
4.10.查询数据内的值
下面的查询是查询colors内red的记录,如果colors元素是一个数据,数据库将遍历这个数组的元素来查询。
db.things.find( { colors : "red" } );
4.11.elemMatch可以匹配内数组内的元素:
> t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )
{ "_id" : ObjectId("4b5783300334000000000aa9"),
"x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]
}
gt : 1 } } 所有的条件都要匹配上才行。
注意,上面的语句和下面是不一样的。
> t.find( { "x.a" : 1, "x.b" : { $gt : 1 } } )
$elemMatch是匹配{ "a" : 1, "b" : 3 },而后面一句是匹配{ "b" : 99 }, { "a" : 11 }
4.12.查询嵌入对象的值
db.postings.find( { "author.name" : "joe" } );
4.13.元操作符 $not 取反
db.customers.find( { name : { $not : /acme.*corp/i } } );
db.things.find( { a : { $not : { $mod : [ 10 , 1 ] } } } );
4.14.投影
即搜索的返回值中,只显示指定的某些字段。字段指为0的不现实,
指为1的显示,默认为1。
格式为:
db.mycollection1.find(
{查询条件},
{显示与否的选项}
)
如:
db.mycollection1.find(
{},
{ _id: 0, name: 1, age: 1 }
)
4.15.排序
可以按指定的某些字段排序,字段标记为1的为Asc升序,
标记为-1的为Desc降序。
db.mycollection1.find().sort({ name:1, age:-1 })
4.16.统计
db.mycollection1.find().count()
db.mycollection1.count( {查询条件} )
4.17.消除重复
db.集合名.distinct( "指定字段", {查询条件} )
如:
db.mycollection1.distinct(
"job",
{ age: {$lt: 40} }
)
5.聚合查询 暂略
6.更新满足条件的2重数组内的值
var filter = {
'ymd':'YYYY/MM/DD'
}
var arrayFilters = {
arrayFilters:[
{
'userRecord.director':'更新条件'
},
{
'type.type':'更新条件'
}
]
}
var updater = {'userRecords.$[userRecord].types.$[type].scheduleRecords': 更新数据}
db.collection(this.collectionName).updateMany(
filter, updater, arrayFilters, upsert).then(xxx)
参考:https://thecodebarbarian.com/a-nodejs-perspective-on-mongodb-36-array-filters
7.数据库导入导出
7.1. mongodump备份数据库
命令格式:
mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径
如果没有用户密码,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。
把lanzy数据库中的内容导出文件到 /home/admin/下,
mongodump -d lanzy -o /home/admin/
7.2. mongorestore还原数据库
命令格式:
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件存在路径
如果没有用户密码,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉--port。
如果想导出所有数据库,可以去掉-d。
把文件 /home/admin/lanzy 导入到数据库audit中
mongorestore -d lanzy --dir /home/admin/lanzy
7.3. mongoexport导出表,或者表中部分字段
命令格式:
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 --csv -o 文件名
-f:导出指字段,以逗号分割,-f a,b,c,嵌套格式的字段格式为:a.b
-q:格式为,-q '{ "user" : "lanzy" }' 导出user为lanzy的数据
--csv:建议使用 --type csv
7.4. mongoimport导入表,或者表中部分字段
7.4.1.还原整表导出的非csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsert --drop 文件名
--upsert 插入或者更新现有数据
7.4.2,还原部分字段的导出文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --upsertFields 字段 --drop 文件名
--upsertFields跟--upsert一样
7.4.3,还原导出的csv文件
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 类型 --headerline --upsert --drop 文件名
网友评论