docker pull mongo # 拉去mongoDB镜像
-- 启动mongoDB容器后,进入它的命令行运行
mongo # 连接mongo服务(有密码: mongodb://admin:123456@localhost/)
show dbs # 查看所有数据库
use admin # 选择数据库admin,没有则自动创建
db.createUser({ user: 'admin', pwd: '123456', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }); # 创建一个admin管理员账号
#--- 出现如下,则说明创建成功
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
#---
db.auth("admin","123456"); # 验证身份对不对
show collections # 查看所有集合(相当于show tables)
# ------ 启动mongoDB管理界面
docker pull mongo-express # 领取镜像
# 启动容器 (--link mongo容器id:mongo容器名 链接mongoDB容器,使其可接收数据) (-e ME_CONFIG_MONGODB_SERVER="链接的MongoDB容器名称" )
docker run -itd -p 8081:8081 --link e8797fbe90f9:mongo1 -e ME_CONFIG_BASICAUTH_USERNAME="admin" -e ME_CONFIG_BASICAUTH_PASSWORD="123456" -e ME_CONFIG_MONGODB_SERVER="mongo1" mongo-express
# 浏览器打开localhost:8081即可访问
mongodb语法
use test; # 如果不存在数据库test,则会隐式创建
db.createCollection('tb1'); # 创建集合tb1(表)
show collections; # 查看此数据库下使用集合
db.tb1.drop(); # 删除集合tb1 -- true|false
db.tb2.insert({name:"test",age:32}); # 往集合tb2中插入一条数据,如果集合不存在则会隐式创建
db.tb2.insert([{name:"test2",age:12},{name:"name2",age:22}]); # 以数组形式向集合tb2插入多条数据
db.tb2.find(); # 查询集合tb2所有数据
for (var i=0;i<6;i++){ # 循环插入数据
db.tb2.insert({name:"n"+i,age:i})
}
# db.集合名.find({查询条件}[,{查询的列}]) 查询语法,[]表示可选(不管选择了什么列,系统自定义的_id都会在)
db.tb2.find({}); # 查询集合tb2中的所有数据
db.tb2.find({age:5,name:'n3'}) # 查询age=5 and name='n3'的数据
db.tb2.find({age:5},{age:1}) # 只查询age=5的age列
db.tb2.find({},{age:0}) # 查询除列age外的所有数据
# 查询时间范围内数据 ISODate("2021-05-20T00:00:00.000+08:00")<=orderinfo.dwinserttime<ISODate("2021-05-21T00:00:00.000+08:00")
db.table_name.find({"$and":[{"orderinfo.dwinserttime":{"$gte":ISODate("2021-05-20T00:00:00.000+08:00")}},{"orderinfo.dwinserttime":{"$lt":ISODate("2021-05-21T00:00:00.000+08:00")}}]})
.projection({})
.sort({_id:-1})
.count();
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
# db.tb2.find({键:{运算符:值}})
db.tb2.find({age:{$gte:30}}) # age >=30
db.tb2.find({age:{$in:[2,6]}}) # age in (2,6)
mongoDB文档修改语法
语法: db.集合名.update(条件,新数据[,是否新增,是否修改多条])
新数据语法:{修改器:{键:值}}
是否新增:条件匹配不到数据则插入(true是插入,默认是false不插入)
是否修改多条:将匹配成功的数据都修改(默认false)
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
db.tb3.update({title:"t0"},{title:"tt0"}) # 用{title:"tt0"}替换title=t0的数据
db.tb3.update({title:"t1"},{$set:{title:"tt1"}}) # 把title=t1的修改为tt1
db.tb3.update({title:"t2"},{$inc:{price:10}}) # 将title=2的price加10
db.tb3.update({title:"t2"},{$inc:{price:-9}}) # 将title=2的price减9
# 一次性写多个修改器
db.tb3.update({title:"t0"},{
$set:{title:"tt0"},
$inc:{price:-3},
$unset:{dis:true}
})
db.tb3.update({title:"ex"},{$set:{price:20}},true) # 第3个参数为true,找不到匹配数据则插入
mongoDB文档删除语法
语法:db.集合名.remove(条件[,是否删除一条数据])
(true:只删除一条;false:删除全部匹配数据;默认false)
db.tb3.remove({},true) # 只删除一条数据
db.tb3.remove({}) # 删除全部
# 查询结果格式化
db.tb3.find().pretty()
查询结果如下:
{
"_id" : ObjectId("5ff1d55c4051fd289774d19e"),
"title" : "t0",
"price" : 0,
"dis" : "fgjj"
}
{
"_id" : ObjectId("5ff1d55c4051fd289774d19f"),
"title" : "t1",
"price" : 1,
"dis" : "fgjj"
}
{
"_id" : ObjectId("5ff1d55c4051fd289774d1a0"),
"title" : "t2",
"price" : 2,
"dis" : "fgjj"
}
# 排序
db.tb3.find().sort({price:-1}) # -1降序排序;1升序排序
db.tb2.find().sort({age:1}).skip(3).limit(5) # 跳过前3条,查询5条数据;分页
db.tb2.find().count() # 查询数据总条数
聚合查询
db.集合名.aggregate([
{管道:{表达式}}
...
])
管道 | 描述 |
---|---|
$group | 将集合中的文档分组,用于统计结果 |
$match | 过滤数据,只输出符合条件的文档 |
$sort | 集合数据进一步排序 |
$skip | 跳过指定文档数 |
$limit | 限制集合数据返回文档数 |
$sum | 总和 $sum:1 同count |
$avg | 平均 |
$min | 最小值 |
$max | 最大值 |
$each | 和$addToSet操作符一起使用添加多个值到数组字段中如果值不存在于数组字段中。 |
$pullAll | {$pullAll:{field:value_array}} 一次删除数组内的多个值 |
# 把集合tb2按name分组,取sum(age)
db.tb2.aggregate([
{
$group:{
_id:"$name",
rs:{$sum:"$age"}
}
}
])
# 集合tb2的数据总数total_num和平均年龄tatal_avg
db.tb2.aggregate([
{
$group:{
_id:null,
total_num:{$sum:1},
total_avg:{$avg:"$age"}
}
}
])
# 按name分组,按name相同数量升序排序
db.tb2.aggregate([
{
$group:{
_id:"$name",
rs:{$sum:1}
}
},
{
$sort:{rs:1}
}
])
操作符一起使用添加多个值到数组字段中如果值不存在于数组字段中。
{ $addToSet: { <field>: { $each: [ <value1>, <value2> ... ] } } }
mongoDB索引
db.tb2.getIndexes() # 查看集合tb2的索引
db.tb2.createIndex({age:1}) # 给集合tb2的字段age添加索引,1代表升序
db.tb2.createIndex({name:-1},{name:"index_name"}) # 给集合tb2的name字段添加降序索引,索引名为index_name
#查看索引如下
[
{
"v" : 2,
"key" : {
"_id" : 1 # 索引字段:排序方式
},
"name" : "_id_" #索引名
},
{
"v" : 2,
"key" : {
"age" : 1
},
"name" : "age_1"
},
{
"v" : 2,
"key" : {
"name" : -1
},
"name" : "index_name"
}
]
#删除索引 db.集合名.dropIndex("索引名")
db.tb2.dropIndex("age_1") # 删除集合tb2中索引名为age_1的索引
#删除集合的全部索引 db.集合名.dropIndexes()
db.tb2.dropIndexes() # 删除集合tb2的全部索引(系统索引_id还在)
db.tb2.createIndex({name:1,age:-1},{name:"index_name_group"}) # 创建组合索引
db.tb3.createIndex({title:1},{unique:"title"}) # 给title字段创建唯一索引
ObjectId("60a53600e876c71383fd69f0").getTimestamp(); // ISODate("2021-05-20T00:00:00.000+08:00") -- 查询objectId的时间
// 把时间用js转成objectId字符串,然后就可以根据_id查询数据范围内的数据了
db.market_info.find({
_id:{
'$gte': ObjectId("60b508000000000000000000"), // 查询_id>=
'$lt': ObjectId("60b659800000000000000000") // _id <
}
})
.projection({})
.sort({_id:-1})
.count();
function timeToObjId( time ) {
var t = new Date(time);
t = t.getTime()/1000; // 转换成秒数
return t.toString(16)+'0000000000000000'; // 转换成16进制的字符串,再加补齐16个0
}
var objIdTimeFrom = timeToObjId( '2021-06-01 00:00:00' );
var objIdTimeFrom2 = timeToObjId( '2021-06-04 00:00:00' );
console.log(objIdTimeFrom); // 60b508000000000000000000
console.log(objIdTimeFrom2); // 60b8fc800000000000000000
$elemMatch
db.test.insert({
"class":"1",
"student":[
{"name":"mac","age":18,"sex":true},
{"name":"jack","age":19,"sex":true},
{"name":"rose","age":20,"sex":false}
]
})
db.test.find({ // 查询student.name = mac or student.age=20的数据
"student.name":"mac",
"student.age":20
})
db.test.find({ // 查询student.name = mac and student.age=20的数据
"student":{$elemMatch:{"name":"mac","age":20}}
})