数据库建立

创建自定义数据库

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)

MongoDB基本操作(Nosql数据库入门与实践)相关推荐

  1. 刘瑜《NoSQL数据库入门与实践 基于MongoDB、Redis》PDF下载

    NoSQL数据库入门与实践 基于MongoDB.Redis [作 者]刘瑜,刘胜松著 [形态项] 483 [出版项] 北京:中国水利水电出版社 , 2018.03 [ISBN号]978-7-5170- ...

  2. Nosql复习笔记,教材《NoSQL数据库入门与实践》

    Nosql复习笔记 目录 一.NoSQL数据库的主要技术特点有以下几种. 二.单机的局限性 三.服务器的纵横扩充 四.帽子定理CAP 五.BASE:基本可用(BA). 软状态(S).最终一致性(E) ...

  3. NoSQL数据库入门与实践——整理(一)

    ********MongoDB命令大小写敏感********* 1.创建数据库并切换到当前使用数据库空间 use 数据库名称 2.查看数据库 show dbs 3.统计某数据库信息 db.stats( ...

  4. NoSQL数据库入门与实践课后习题(第一章)

    1.写出DB.RDB.DBMS.TRDB. NoSQL. NewSQL. SSD. NDFS的中文名称.英文全称. 答:DB:数据库.Database.RDB:关系型数据库.Relational Da ...

  5. NoSQL数据库入门与实践答案----第二章

    一 1.机械硬盘 2.横向扩展    纵向扩展 3.速度 4.横向    纵向 5.数据存储    处理速度 6.结构化    非结构化或半结构化 7.规则和完善性    行级锁和外键约束    快 ...

  6. NoSQL数据库入门与实践答案----第三章

    1.  键  值  键值对  命名空间 2.  键值对  集合  文档  数据库 3.  命名空间  行键  列族  列 4.  节点  边  属性  图 5.  较弱  较强  很强 6.  最快  ...

  7. NoSQL数据库入门概述

    关系型数据库与NoSql数据库 什么是NoSQL Not Only SQL,其含义是:适合关系型数据库的时候就是用关系型数据库,不适用的时候也没必要非得使用关系型数据库不可,可以考虑使用更加合适的数据 ...

  8. nosql数据库入门_NoSQL入门资料

    nosql数据库入门 虽然您中的某些人可能是NoSQL专家,但通常缺乏对NoSQL的扎实知识,以及一些常见的神话. 具体地说,诸如NoSQL适用性/用例及其与关系数据库的比较(公平和不公平)之类的主题 ...

  9. nosql数据库入门_NoSQL入门三步指南

    nosql数据库入门 我一直在研究NoSQL数据库几个月,并希望与我分享我的经验. 如果您打算开始学习NoSQL数据库,那么这篇文章可能会对您有所帮助. 我会尝试链接我认为有用的资源. 步骤1:什么是 ...

最新文章

  1. git提交时支持文件名大小写的修改
  2. python如何导入turtle_centos7里python导入turtle的问题
  3. spring4.0之二:@Configuration的使用
  4. 2 image pil 转_pdf转图片,php语言和Java语言的两种方法
  5. iOS屏幕尺寸和分辨率了解
  6. 【Kaggle】Intermediate Machine Learning(缺失值+文字特征处理)
  7. graphpad细胞增殖曲线_肿瘤干细胞?居然被这两个新加坡人轻松干掉了?
  8. sqlite数据库中的sql语句大全-zhuan
  9. 腾讯视频 android 2倍,腾讯视频多倍速播放产品设计小结
  10. LaTeX中常用的模板,命令和技巧
  11. 华为s5720默认用户名和密码_华为华为交换机的默认用户名和密码是多少?谢谢!...
  12. cmd怎么查看当前静态路由_计算机cmd命令之route,查看路由表,或配置一个更有效的路由...
  13. 深圳证券交易所关于五种市价委托方式的业务说明
  14. 在eclipse中修改tomcat端口
  15. sco unix 管理员速成
  16. macOS下malware移除实战之Qsearch浏览器劫持的移除
  17. 关于平面几何分割问题,推广至立体几何分割
  18. java评论、回复功能设计和实现
  19. linux 桌面 性能,观点|六种 Linux 桌面的最佳特性和最差特性
  20. python爬虫进程池_python爬虫之进程池爬虫(世纪佳缘案例)

热门文章

  1. Python一行代码搞定炫酷可视化,Cufflinks值得拥有 !
  2. JTextArea用法
  3. how to search books in gitbook
  4. 宁波市教育学院计算机系主任,欢迎宁波诺丁汉大学计算机系主任白瑞斌教授一行到访南科大...
  5. 机器学习从蛋白序列预测蛋白分类(二)
  6. 【无标题】西门子smart触摸屏连接1200PLC
  7. check(check out)
  8. win8 如何摄像头测试软件,高手解说win8系统摄像头检测不到的设置教程
  9. 射频原理图设计checklist
  10. 计算机应用基础2020年最新档案,计算机应用基础 高职计算机大类专业 刁爱军项目三 人事档案管理.pptx...