数据库建立
创建自定义数据库
use 数据库名
use goodsdb
如果goodsdb数据库不存在,则新建立数据库;如果goodsdb数据库存在,则连接该数据库
查看数据库
show dbs
对于刚刚新建的数据库没有显示,因为这个数据库里没有内容
统计某数据库信息
db.stats()
删除数据库
db.dropDatabase() //删除当前数据库
不要随便使用,一般情况下具有不可恢复性
查看当前数据库下的集合名称
db.getCollectionNames()
查看数据库用户角色权限
show roles //查看当前数据库的用户角色权限及用户名、密码等信息
Mongodb基本操作
插入、更新、删除、查询、索引、聚合、复制、分片等
插入文档
db.集合名.insert()
插入文档
db.goodsbaseinf.insert(
{name:"《C语言编程》",price:32
}
)
插入一条复杂文档
db.goodsbaseinf.insert(
{
name:"《C语言》",
bookprice:33.2,
adddata:2017-10-1,
allow:true,
baseinf:{
ISBN:183838388,
press:"清华大学出版社"
},
tags:["good","book","it","Program"]
}
)
插入值里可以嵌套文档,避免传统关系里多表关联运算
insert命令可以包含数组,用于记录分类等信息
插入多条文档
db.goodsbaseinf.insert(
[
{
item:"小学生教材",name:"《小学一年级语文(上册)》",price:12
},
{
item:"初中生教材",name:"《初中一年级语文(上册)》",price:15
},
{
item:"高中生教材",name:"《高中一年级语文(上册)》",price:20
}
]
)
利用中括号,实现一次多条文档插入
多条文档一次性插入,利用了insert的原子性事务特征,保证所有插入文档要么插入成功,要么不成功
用变量方式插入文档
document=({name:"《C语言编程》",price:32})
db.goodsbaseinf.insert(document)
有序插入多条文档
db.goodsbaseinf.insert(
[
{
_id:10,item:"小学生教材",name:"《小学一年级语文(上册)》",price:12
},
{
_id:12,item:"初中生教材",name:"《初中一年级语文(上册)》",price:15
},
{
_id:11,item:"高中生教材",name:"《高中一年级语文(上册)》",price:20
}
],
{ordered:true} //有序插入设置
)
假设在 goodsdb.goodsbaseinf 集合里已经有“_id:11”的一条文档记录。那么在执行上述命令时,命
令执行将失败。也就是一条文档在ids 相同的情况下不能重复插入。
在 ordered:true 时,一条都不插 入:在 ordered:false 时,除了出错记录外,其他记录继续插入。
自定义写出错确认级别
db.goodsbaseinf.insert(
{name:"《C语言编程》",price:32
},
{
writeConcern:{ w: "majority", wtimeout: 5000}
} //5000毫秒
)
假设在多服务器插入该条文档命令时,因网络拥堵原因,超过 5 秒未完成命令操作。该命令将放弃执行,并返回一个出错对象内容。
简化的插入命令
db.goodsbaseinf.insertOne()
db.goodsbaseinf.insertMany()
db.collection.insertOne()和insert的区别,可以让程序员确保插入的是一条文档,而不能做多文档处理。
insertOne()和insertMany()是为偷懒准备的,可以更好地减少插入文档的出错率,并提高编程效率。
查询文档
查询集合所有文档
db.goodsbaseinf.find()
美化显示
db.goodsbaseinf.find().pretty()
等价条件查询
db.goodsbaseinf.find(
{
name:"《C语言编程》"
}
)
若不想显示_id及值,并指定显示值,可以进行如下操作
db.goodsbaseinf.find(
{
name:"《C语言编程》"
},
{
name:1,price:1,_id:0
}
)
0或false不显示指定字段,1或true显示指定字段
嵌套文档查询
db.goodsbaseinf.find(
{
"baseinf.press":"清华大学出版社"
}
)
这里通过"."号连接 baseinf 和 press,并以加双引号方式来实现指定嵌套文档的查询。
数组查询
>db.goodsbaseinf.find(
{
tags:["good","book","it","Program"]
}
) //等价查询某一数组
>db.goodsbaseinf.find(
{
tags:"good"
}
) //查询数组里的某一个值
>db.goodsbaseinf.find(
{
tags:{$size:4}
}
) //查询有4个元素的数组
查到的都是符合这一条件的文档
查找null值字段
>db.goodsbaseinf.insert(
[
{_id:2222,toy:null},
{_id:1112}
]
)
>db. goodsbaseinf.find(
{
_id:2222,toy:null
}
) //查找 nu11 值字段
>db. goodsbaseinf.find(
{
_id:1112,toy:{$exists:false}
}
) //查找的值不存在
null不仅会匹配某个键的值为null的文档,而且还会匹配不包含这个键的文档。
如果仅仅想匹配键值为null的文档,既要检查该建的值是否为null,还要通过"$exists"条件判定键是否存在。
查找返回值游标操作
var showCursor=db.goodsbaseinf.find()
showCursor.forEach(printjson);
limit与skip方法查询
db.goodsbaseinf.find().limit(1) //返回第一条文档
db.goodsbaseinf.find().skip(2) //显示第3条开始的文档记录
带$in运算符的查询
>db.goodsbaseinf.find(
{
_id:{$in:[12,ObjectId("59322b6051baf2e220bacic2")]}
}
)
//查找_id等于12或ObjectId("59322b6051baf2e220bac1c2")的文档记录
用 带$in运算符 实现 或(or)条件查询
通过查询操作符来查询
操作符 | 实例 |
小于 | db.goodsbaseinf.find({price:{$lt:15}}) |
小于等于 | db.goodsbaseinf.find({price:{$lte:15}}) |
大于 | db.goodsbaseinf.find({price:{$gt:15}}) |
大于等于 | db.goodsbaseinf.find({price:{$gte:15}}) |
不等于 | db.goodsbaseinf.find({price:{$ne:15}}) |
与(and) | db.goodsbaseinf.find({name:"《小学一年级语文(上册)》",price:12}).pretty() |
或(or) | db.goodsbaseinf.find({$or:[{name:"《小学一年级语文(上册)》"},{price:12}]}) |
正则表达式 | - |
或:db.goodsbaseinf.find({$or:[{ },{ }]})
$in 用于不同文档指定同一个 Key 进行或条件匹配,$or 可以指定多个 Key 或条件匹配。
正则表达式pattern选项
pattern选项 | 实例 |
/查询值的固定后一部分$/ | db.goodsbaseinf.find({name:{$regex:/语文$/}}) |
/^查询值的固定前一部分/ | db.goodsbaseinf.find({name:{$regex:/^C语言/}}) |
/查询值的任意部分/ | db.goodsbaseinf.find({name:{$regex:/C/}}) |
正则表达式options选项
options选项 | 实例 | 选项说明 |
i | db.goodsbaseinf.find({name:{$regex:/^C语言/i}}) | 不区分大小写 |
m | db.goodsbaseinf.find({name:{$regex:/^C/,$options:"m"}}) | 在一个文档值存在多字符串记录的情况下(中间以\n或$分隔),以记录为单位,匹配符合的文档记录。如果文档值中不包含\n 或$,则m选项不起作用 |
x | db.goodsbaseinf.find({name:{$regex:/上/,$options:"x"}}) | 在字符串文档值中,忽略有空格的、hash 值的或带#的文档记录 |
s | db.goodsbaseinf.find({name:{$regex:/^.*C/,$options:"si"}}) | 在多字符串记录情况下,使用 s 可以做到pattern 带“.*” 情况下的多字符串行匹配 |
区间条件查找
db.goodsbaseinf.find(
{
price:{$gt:3,$lt:33}
}
) //查询价格范围大于 3 小于 33 的值。可用于文档数值字段,也可以用于数组字段
更新文档
修改一条简单文档
db.order.update(
{
title:"商品购物单1"
},
{
$set:{title:"商品购物单2"}
}
)
修改某一值,用 $set 操作符
},
{
$inc:{amount:5} //加
$mul:{amount:2} //乘
$rename:{"titlss":"title"} //修改错误字段的键名,在键名大量出错的情况下尤其有用
$unset:{unit:"元"}
$min:{amount:50} //将$min 给出的值与当前文档字段值进行比较,当给定值较小时则修改当前文档值为给定值
$max:{amount:50.5} //将$max 给出的值与当前文档字段值进行比较,当给定值较大时则修改当前文档值为给定值
}
用 ISODate 更新当前文档时间字段的值
db.order.insert(
{
_id:11,
lasttime:ISODate("2017-06-03 13:58:55")
}
)
db.order.update(
{
_id:11
},
{
lasttime:ISODate("2017-07-03 13:58:55")
}
)
修改一条文档里的数组和嵌套数组
db.order.update(
{
_id:12
},
{
$set:{
"detail.1":{name:"大米",price:40}, //修改数组值
"overview.address":"天津市和平区成都道0号" //修改子文档
}
}
)
对文档里的子文档值进行修改,可以通过主Key.SubKey 的组合来实现指定子文档字段对应值的修改;
对于数组值的修改,可以通过 KeyNumber 的方式指定修改数组值,Number 从 0,1…开始,对应数组的第一个下标、第二个下标……
引用数组或嵌入文档对象时,都需要加""号,如"detail.1""overview.address",中间用点号隔离。
多文档修改
采用multi选项
db.order.update(
{
"detail.name":"面粉",
"detail.price":{$lte:30} //find()查询条件操作符,可以用在update操作条件上
},
{
$set:{
"detail.1":{name:"面粉",price:40}
}
},
{
multi:true //修改所有面粉价格小于等于30的文档记录,把面粉价格改为40
}
)
增加文档字段
bd.order.update(
{
_id:10
},
{
$set:{
"detail.0":{name:"西瓜",price:10},
unit:"元"
}
},
{
upsert:true
}
)
Update 命令在特定情况下,可以增加文档的字段,甚至实现 insert 命令功能。
这个特定条件是要修改的文档没有要修改的字段,而且 update 命令带 upsert 选项。
自定义写确认级别
},
{
writeConcern:{w: "majority",wtimeout:5000}
}
当 update 命令在 5 秒内没有执行完成时,取消该命令操作,并返回错误值
collation参数使用
collation: {
locale:<string>, //若要使用 collation 参数,locale 是必选的,其他是可选
caseLevel:<boolean>,
caseFirst:<string>,
strength:<int>,
numericOrdering:<boolean>,
alternate:<string>,
maxVariable:<string>,
backwards:<boolean>,
normalization <Boolean>
}
参数说明:更新规则参数允许程序员为字符串比较指定特定国家语言的规则,如字母的大小写、重音标记等。
删除文档
db.collection.remove
删除一个集合里所有文档记录
db.tests.remove({}) //删除一个集合里所有文档记录,不会删除索引
若要删除整个集合,采用db.tests.drop()方法效率更高,它会把整个集合和索引一起删除。
删除符合条件的所有文档集合
db.tests.remove(
{
price:{$gt:3}
}
) //删除价格大于3的所有文档记录
自定义写出错确认级别
},
{
writeConcern:{w: "majority",wtimeout:5000}
}
删除价格小于 3 的所有文档记录,当时间超过 5 秒时,或者副本集大多数已完成该命令执行时,就中断该命令的执行,返回该命令的操作结果
删除满足条件的单个文档记录
db.test.remove(
{
prive:{$gt:3}
},
{
justOne:true
}
) //删除价格大于3的第一个文档记录
删除含特殊语言符号的文档记录
},
{
cllation:{locale:"fr",strength:1}
} //只对法文的基本字母进行比较,忽略读音符和大小写等
索引
基于集合建立索引(Index),目的是为了提高查询速度。
默认情况下,在建立集合的同时,MongoDB 数据库自动为集合_id 建立唯一索引,可 以避免重复插入同一id 值的文档记录。
单一字段(键)索引
对单一键建立索引
db.books.createIndex(
{
name:1
}
) //在books集合中针对name字段创建一个升序排列的索引
对一个集合文档的键建立索引,key为键名,n=1为升序,n=-1为降序
嵌套文档单字段索引
db.books.createIndex(
{
"tags.press":1
}
)
字段值唯一索引
db.books.createIndex(
{
name:1
},
{
unique:true
}
)
name的 值必须是唯一的,不能有重复值出现,否组MongoDB将新插入的重复文档予以拒绝。
没有{unique:true}参数选项的情况下,索引方法允许存在字段值重复的多文档记录。
在集合的同一个键上不能重复建立单一索引;若已经建立了索引,再在同一个 Key 上建立索引,将给予出错提示。
多字段索引
建立多字段索引
db.books.createIndex(
{
price:1,color:-1
}
) //对两个字段建立索引
db.books.find({},{_id:0}).sort({price:1,color:-1}) //用sort排序查询
先用createIndex命令建立price、color多键组合索引
然后用 find() 查找文档记录
对查找出来的文档记录结果用 sort({price:1,color:-1}) 先用做 price 升序排序,在 price 价格一样的情况下,再对 price 相同记录做 color 降序排序
多字段唯一索引
db.createIndex(
{
name:1,price:1
},
{
unique:true
}
)
只要name和price组合起来的值保持唯一性。
文本索引
在集合中,为文本字段内容的文档建立文本索引。
基本文本索引
db.books.createIndex(
{
name:"text"
}
) //为name建立文本索引
指定权重文本索引
db.books.createIndex(
{
name:"text",
price:"text"
},
{
weights: {name:10}, //为name指定索引权重
name:"TextIndex"
} //默认情况下,price权重为1
)
通配符文本索引
db.books.createIndex({ "$**":"text"})
为指定集合中的所有字符串内容进行搜索提供通配索引,这在高度非结构化的文档里比较有用。
哈希索引
db.books.createIndex({_id:"hashed"})
key为含有哈希值的键
hashed索引不支持多字段索引
会把浮点数的小数部分自动去掉
不支持唯一索引
ensureIndex()索引
用ensureIndex命令建立索引
db.books.ensureIndex({_id:"hashed"})
与索引相关的其他方法
>db.collection.dropIndex(index) //移除集合指定的索引功能。index 参数为指定需要删除的集合索引名,可用 getindexes()函数获取集合的所有索引名称。
>db.collection.dropIndexes() //移除一个集合的所有索引功能。
>db.collection.getIndexes() //返回一个指定集合的现有索引描述信息的文档数组。
>db.collection.reIndex() //删除指定集合上所有索引,并重新构建所有现有索引。在具有大量数据集合的情况下,该操作将大量消耗服务器的运行资源,引起运行性能急剧下降等问题的发生。
>db.collection.totalIndexSize() //提供指定集合索引大小的报告信息。
聚合
聚合(Aggregation)为集合文档数据提供各种处理数据方法,并返回计算结果。
聚合管道方法
db.Sale_detail.insert(
[
{goodsid:"1001",amount:2,price:10.2,ok:false},
{goodsid:"1001",amount:3,price:14.8,ok:false},
{goodsid:"1002",amount:10,price:50,ok:false},
{goodsid:"1002",amount:2,price:10,ok:true}
]
)
db.Sale_detail.aggregate(
[
{
$match:{ok:false}
}, //查找条件
{
$group:{
_id:"$goodsid",
total:{$sum:"$amount"}
} //按goodsid分类统计amount字段的总数量
}
]
)
统计结果:
_id:必须指定唯一性字符,不能改为其他名称的字段
goodsid:分类字段名
total:统计结果字段名,可以是任意符合起名规则的新名称
$sum:求和操作符号
$amount:求和字段,必须加上双引号
除了$sum,还有$avg、 $min、$max、$push、$addToSet、$first、$last 操作符等
map-reduce方法
>var mrr=db.Sale_detail.mapReduce(
function(){ //map 自定义函数
emit(this.goodsid,this.amount)
},
function(key,values) { //Reduce 自定义函数
return Array.sum(values)
},
{
query:{ok:false},
out:{replace:"result"}
}
>db[mrr.result].find()
单一目标聚合方法
db.collection_name.count(query,options)
>db.Sale_detail.count({ok:false}) //统计符合条件的记录数
>db.Sale_detail.count({ok:false},{skip:1}) //从第二条开始统计符合条件的记录数
>db.Sale_detail.count({ok:false},{limit:3}) //限制要计数的文档的最大数目
db.collection_name.distinct(<key>,query,option)
统计指定键的不同值并返回不同值
db.Sale_detail.distinct("goodsid") //结果["1001","1002"]
单一目标聚合方法,可以直接在 find()后加点使用。
如 goodsdb.Sale_detail.find({ok:false}).count()
goodsdb.Sale_ detail.find({ok:false}).count().skip(1)