MongoDB
MongoDB简介
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。目的是为WEB应用提供扩展的高性能的数据存储解决方案。数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
相关命令
-
show dbs 显示所有的数据库
-
db 当前所在数据库
-
use 使用该数据库/建立数据库
-
db.dropDatabase( ) 删除数据库
-
db.version() 数据库版本
-
show collections 显示当前数据所有的集合
-
db.集合.insert( ) 插入数据
-
db.集合.find( ) 查询所有数据
-
db.集合.findOne( ) 查询第一个文件数据
-
db.集合.update({查询},{修改}) * 修改文件数据*
-
db.集合.remove({条件}) 删除数据
-
db.集合.drop( ) 删除整个集合
-
db.集合.insert([数组]) 插入数据
-
db.集合.update(query,update,upsert,multi)
14.1 query : update的查询条件,类似sql update查询内where后面的。
14.2 update : update的对象和一些更新的操作符(如$set,$inc...)等,也可以理解为sql update查询内set后面的
操作对象:
$set 用来修改一个指定的键值(key)。有两种情况一种是内嵌的形式,一种是非内嵌的形式
假如数据库有条数据: { name:'MinJie', age:20, sex:0, job:'UI设计', skill:{ skillOne:'PhotoShop', SkillTwo:'UI', SkillThree:'Word+Excel+PPT' }, interest:[], regeditTime:new Date() } 非内嵌 db.workmate.update({"name":"MinJie"},{"$set":{sex:2,age:21}}) 内嵌形式 db.workmate.update({"name":"MinJie"},{"$set":{"skill.skillThree":'word'}})
$unset用于将key删除
db.workmate.update({"name":"MinJie"},{$unset:{"age":''}})
$inc对数字进行计算
db.workmate.update({"name":"MinJie"},{$inc:{"age":-2}})
操作数组:
$push追加数组/内嵌文档值
db.workmate.update({name:'MinJie'},{$push:{interest:'draw'}}) db.workmate.update({name:'MinJie'},{$push:{"skill.skillFour":'draw'}})
$ne查找是否存在。 (没有则修改,有则不修改)
db.workmate.update({name:'xiaoWang',"interest":{$ne:'playGame'}},{$push:{interest:'Game'}})
$addToSet 升级版的$ne (查找是否存在,不存在就push上去)
b.workmate.update({name:"xiaoWang"},{$addToSet:{interest:"readBook"}})
$each 批量追加
var newInterset=["Sing","Dance","Code"]; db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:{$each:newInterset}}})
$pop 删除数组值 $pop只删除一次,并不是删除所有数组中的值。而且它有两个选项,一个是1 从数组末端进行删除和-1 从数组开端进行删除。
db.workmate.update({name:'xiaoWang'},{$pop:{interest:1}})
数组定位修改
db.workmate.update({name:'xiaoWang'},{$set:{"interest.2":"Code"}})
14.3 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
14.4 multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
-
db.collection.find(query, projection)
-
query:可选,使用查询操作符指定查询条件
-
projection: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)
造数据:
var workmate1={ name:'JSPang', age:33, sex:1, job:'前端', skill:{ skillOne:'HTML+CSS', skillTwo:'JavaScript', skillThree:'PHP' }, regeditTime:new Date(), interest:['写代码','篮球','游泳'] }
简单查找
db.workmate.find({"skill.skillOne":"HTML+CSS"})
筛选字段
db.workmate.find( {"skill.skillOne":"HTML+CSS"}, {name:true,"skill.skillOne":true} )
不等修饰符
小于($lt):英文全称less-than 小于等于($lte):英文全称less-than-equal 大于($gt):英文全称greater-than 大于等于($gte):英文全称greater-than-equal 不等于($ne):英文全称not-equal db.workmate.find( {age:{$lte:30,$gte:25}}, {name:true,age:true,"skill.skillOne":true,_id:false} )
日期查找
//查找注册日期大于2018年1月10日的数据 var startDate= new Date('01/01/2018'); db.workmate.find( {regeditTime:{$gt:startDate}}, {name:true,age:true,"skill.skillOne":true,_id:false} )
多条件查询
$in修饰符
// 查找年龄是25岁和33岁的信息 db.workmate.find({age:{$in:[25,33]}}, {name:1,"skill.skillOne":1,age:1,_id:0} )
$or修饰符
//如查询同事中大于30岁或者会做PHP的信息 db.workmate.find({$or:[ {age:{$gte:30}}, {"skill.skillThree":'PHP'} ]}, {name:1,"skill.skillThree":1,age:1,_id:0} )
$and修饰符
//$and用来查找几个key值都满足的情况.大于30岁并且会做PHP的信息 db.workmate.find({$and:[ {age:{$gte:30}}, {"skill.skillThree":'PHP'} ]}, {name:1,"skill.skillThree":1,age:1,_id:0} )
$not修饰符
//它用来查询除条件之外的值,比如我们现在要查找除年龄大于20岁,小于30岁的人员信息。 db.workmate.find({ age:{ $not:{ $lte:30, $gte:20 } } }, {name:1,"skill.skillOne":1,age:1,_id:0} )
find的数组查询
基本数组查询
//一个中括号([]),因为加上中括号就相当于完全匹配了 db.workmate.find({interest:['画画','聚会','看电影']}, {name:1,interest:1,age:1,_id:0} )
$all-数组多项查询
//查询出喜欢看电影和看书的人员信息 db.workmate.find( {interest:{$all:["看电影","看书"]}}, {name:1,interest:1,age:1,_id:0} )
$in-数组的或者查询
//$in主要满足数组中的一项就可以被查出来.查询爱好中有看电影的或者看书的员工信息 db.workmate.find( {interest:{$in:["看电影","看书"]}}, {name:1,interest:1,age:1,_id:0} )
$size-数组个数查询
//$size修饰符可以根据数组的数量查询出结果.要查找兴趣的数量是5个人员信息 db.workmate.find( {interest:{$size:5}}, {name:1,interest:1,age:1,_id:0} )
$slice-显示选项
//有时候我并不需要显示出数组中的所有值,而是只显示前两项,比如我们现在想显示每个人兴趣的前两项,而不是把每个人所有的兴趣都显示出来。slice:-1,就是最后一项 db.workmate.find( {}, {name:1,interest:{$slice:2},age:1,_id:0} )
find的参数使用方法
- query:这个就是查询条件,MongoDB默认的第一个参数。
- fields:(返回内容)查询出来后显示的结果样式,可以用true和- - false控制是否显示。
- limit:返回的数量,后边跟数字,控制每次查询返回的结果数量。
- skip:跳过多少个显示,和limit结合可以实现分页。
- sort:排序方式,从小到大排序使用1,从大到小排序使用-1。
$where修饰符
//它是一个非常强大的修饰符,但强大的背后也意味着有风险存在。它可以让我们在条件里使用javascript的方法来进行复杂查询. db.workmate.find( {$where:"this.age>30"}, {name:true,age:true,_id:false} ) //这里的this指向的是(查询集合)本身
find如何在js文本中使用
-
hasNext循环结果
var db = connect("company") //进行链接对应的集合collections var result = db.workmate.find() //声明变量result,并把查询结果赋值给result //利用游标的hasNext()进行循环输出结果。 while(result.hasNext()){ printjson(result.next()) //用json格式打印结果 }
-
forEach循环
利用hasNext循环结果,需要借助while的帮助,MongoDB也为我们提供了forEach循环,现在修改上边的代码,使用forEach循环来输出结果。
var db = connect("company") //进行链接对应的集合collections var result = db.workmate.find() //声明变量result,并把查询结果赋值给result //利用游标的hasNext()进行循环输出结果。 result.forEach(function(result){ printjson(result) })
建立索引
-
db.集合.stats() 查看数据中的数据条数
-
db.集合.ensureIndex({username:1}) 建立索引
-
db.集合.getIndexes() 查看现有索引
-
db.集合.dropIndex('索引ID')
-
指定索引查询(hint)
//MongoDB的复合查询是按照我们的索引顺序进行查询的。就是我们用db.randomInfo.getIndexes()查询出的数组 //数字的索引要比字符串的索引快,这就需要一个方法来打破索引表的查询顺序,用我们自己指定的索引优先查询,这个方法就是hint(). var rs= db.randomInfo.find({username:'7xwb8y3',randNum0:565509}).hint({randNum0:1});
全文索引
-
建立全文索引
// contextInfo 集合中字段名称 db.info.ensureIndex({contextInfo:'text'})
-
全文索引查找的两个关键修饰符
-
$text:表示要在全文索引中查东西。
-
$search:后边跟查找的内容。
// 查找一个 db.info.find({$text:{$search:"programmer"}}) //查找多个 db.info.find({$text:{$search:"programmer family diary drink"}})
-
文章摘自技术胖MongoDB视频学习 https://jspang.com/posts/2017/12/16/mongodb.html