插入文档 (db.class2.find()查看插入情况)
db.collectionName.insert()
db.collectionName.save()
e.g.:
db.class2.insert({name:'zhang',age:12,sex:'m'})
注意:插入文档时域名可以不加引号
插入多条数据:
db.collectionName.insert([{},{},....])
e.g.:
db.class2.insert([
{name:'wangwu',age:14,sex:'m'},
{name:'xiaohong',age:13}
])
注意 : 如果插入时自己设置 _id 域则系统将不会再添加_id值。但是_id任然是主键,不能重复,否则报错
db.collectionName.save()
数据的 修改 保存
db.class2.save({ "_id" : ObjectId("5ab9e4c0a228afc7dde98e02"),name:'wangliu'})
注意:save({.....})写在一个括号内
当不加_id时插入数据和insert相同
当插入文档有_id时,如果该_id不存在则正常插入。如果该_id存在,则变为修改原有数据save插入数据方法,不能一次插入多条,如果想插入多条只能借助循环语句或程序
e.g.
db.class3.save({'_id':1,name:'huairen'})
补充
show tables 同 show collections
修改集合名称
db.collectionName.renameCollection('newName')
----------------------------------------------------------------
查找操作
select ... from tablename where ...
指定集合方法
1. db.collectionName.
e.g.
db.student.find()
2. db.getCollection(collectionName).
e.g.
db.getCollection('student').find()
find(query,{field:0/1})
功能:查找集合中所有复合要求的文档
参数:query 表示查找条件
相当于 mysql中的where语句
{field:0/1} 展示的域,其中0表示不展示该域
1表示展示该域
返回值:返回查找到的结果
注意:当find()函数不加任何参数,或者只加{}表示查找所有内容
db.collectionName.find() 等价于
select * from tableName
findOne(query,{field:0/1})
功能:查找复合条件的一条文档
参数:同find
e.g.
db.class2.findOne()
查找所有文档中的第一条符合条件的
选择field进行展示
设置field值,1表示查询结果显示该field,0表示不显示
当写了其中某一个field的值,如果该值为1,那么默认其他field值为0,如果该值设置为0,那么其他的默认为1
db.class3.find({},{_id:0,name:0,sex:0})
* 同时设置多个字段的时候,如果一个设置为0,因为其他的默认为1,再设置其他字段的时候只设置想为0的项即可
* 反之亦然,如果一个设置为1,因为其他的默认为0,再设置其他字段的时候只设置想为1的项即可
> db.class2.find()
{ "_id" : ObjectId("5ab8b4aea228afc7dde98de9"), "name" : "rick", "age" : 45 }
{ "_id" : ObjectId("5ab8b4dfa228afc7dde98dea"), "name" : "morty", "age" : 12 }
> db.class2.find({},{name:1})
{ "_id" : ObjectId("5ab8b4aea228afc7dde98de9"), "name" : "rick" }
{ "_id" : ObjectId("5ab8b4dfa228afc7dde98dea"), "name" : "morty" }
> db.class2.find({},{name:0})
{ "_id" : ObjectId("5ab8b4aea228afc7dde98de9"), "age" : 45 }
{ "_id" : ObjectId("5ab8b4dfa228afc7dde98dea"), "age" : 12 }
>
_id值比较特殊,如果不显式给出则它的默认值始终为1
如果不加该参数,则默认所有field都显示
--------------------------------------------------------
query
查找第一个 name 为 zhang的同学
db.class2.findOne({name:'zhang'},{_id:0})
比较操作符
$lt 小于
e.g.
db.class2.find({age:{$lt:15}},{_id:0})
* 也可以比较字符串,按照逐位的ascii码值进行比较
$lte 小于等于
e.g.
db.class2.find({age:{$lte:12}},{_id:0})
$gt 大于
db.class2.find({age:{$gt:12}},{_id:0})
db.class2.find({age:{$gte:12}},{_id:0})
$eq 等于
db.class2.find({age:{$eq:12}},{_id:0})
* 等价于 db.class2.find({age:12},{_id:0})
db.class2.find({name:{$ne:'zhang'}},{_id:0})
db.class2.find({age:{$in:[10,11,12,13]}},{_id:0})
*只要值在数据范围内的都显示出来
db.class2.find({age:{$nin:[10,11,12]}},{_id:0})
逻辑条件组合
db.class2.find({$and:[{name:'zhang'},{sex:'m'}]},{_id:0})
*等价于
db.class2.find({name:'zhang',sex:'m'},{_id:0})
$or 逻辑或
e.g.
db.class2.find({$or:[{name:'zhang'},{sex:'m'}]},{_id:0})
$not 逻辑非
db.class2.find({name:{$not:{$eq:'zhang'}}},{_id:0})
> db.class2.find({name:{$not:{$eq:'rick'}}})
{ "_id" : ObjectId("5ab8b4dfa228afc7dde98dea"), "name" : "morty", "age" : 12 }
{ "_id" : ObjectId("5ab8b6d9a228afc7dde98deb"), "name" : 1, "age" : 45 }
{ "_id" : ObjectId("5ab8b6dea228afc7dde98dec"), "name" : 0, "age" : 45 }
>
$nor 既不也不
db.class2.find({$nor:[{name:'zhang'},{age:11}]},{_id:0})
*查找不满足列表中任意一个条件的文档
条件混合查找
name != 'zhang' and (age == 12 or age == 13)
db.class2.find({name:{$ne:'zhang'},$or:[{age:12},{age:13}]})
age > 13 or (name = 'zhang' and sex = 'm')
db.class2.find({$or:[{age:{$gt:13}},{name:'zhang',sex:'m'}]},{_id:0})
数组查找(hobby是一个数组)
查找集合中hobby数组里包含‘song’的文档:
db.student.find({hobby:'song'})
查找集合中hobby数组里同时包含‘song’和‘run’的文档:
db.student.find({hobby:{$all:['song','run']}},{_id:0})
查找一个数组中是否包含一个区间
db.student.find({score:{$elemMatch:{$gt:70,$lte:90}}},{_id:0})
看score数据中是否有(70,90] 的元素
查找一个数组中包含值得个数
db.student.find({hobby:{$size:2}},{_id:0})
查找hobby数组中包含2个元素的文档
对数据进行筛选
显示score数组中的前三项
db.student.find({},{_id:0,score:{$slice:3}})
显示score数组中的跳过前两项的后面三项
db.student.find({},{_id:0,score:{$slice:[2,3]}})
其他查找条件
查找某个字段存在的记录
查找存在score字段的记录
db.student.find({score:{$exists:true}})
查找不存在score字段的记录
db.student.find({score:{$exists:false}})
查找某个域的值 匹配给定除数和余数的记录
查找age 被2除余数是1的记录
db.student.find({age:{$mod:[2,1]}},{_id:0})
查找某个域指定数据类型的记录
db.student.find({score:{$type:4}},{_id:0})
*在mongo中每种数据类型都匹配了一个整数值
---------------------------------------------------------------------------
和查找相关的一些函数
查看一个集合中某个域的值都包含哪些(类似于关系型数据库中取出某一列的值)
db.collectionName.distinct('col')
e.g.
列出student集合中所有name域的取值内容,如果name是一个列表则将所有name列表中的元素进行整合
db.student.distinct('name')
pretty()
将find结果格式化显示
db.class3.find().pretty()
limit(num)
显示find结果的前num条记录
db.class2.find().limit(2)
skip(num)
跳过前num条记录进行显示
db.class2.find().skip(2)
count()
统计匹配到的记录的条数
db.class2.find().count()
sort({})
按照指定字段进行排序
{age : 1} 按照age进行升序排列
{age : -1} 按照age进行降序排列
当有多个排序项时为复合排序
db.class2.find({},{_id:0}).sort({age:-1})
db.class2.find({},{_id:0}).sort({age:-1,name:1})
---------------------------------------------------------------
删除文档
db.collectionNmae.remove(query,justOne)
功能:删除记录
参数: query : 定位要删除的记录 类似mysql中where
详见 查找部分
justOne:如果不加此参数则删除所有符合query (bool) 条件的记录
如果赋值为true或者1 表示只删除第一条符合query的记录
e.g.
删除所有name为‘zhang’的文档
db.class2.remove({name:'zhang'})
删除第一条age为11的文档
db.class2.remove({age:11},1)
删除全部文档
db.class2.remove({})
-----------------------------------------------------------------------------
1. 创建一个数据库 名字为 grade
2. 数据库中创建集合集合名称为 class
3. 向集合中插入若干文档文档结构如下
{name:‘小红’,age:10,sex:‘w’,hobby:['a','b']}
注意并不一定所有同学都有这些域,爱好个数也不相同
4.查找练习:
查看该班所有学生
查看该班所有年级为4岁的学生
查看该班所有年龄大于4岁的学生 find({age:{$gt:4}})
查看该班所有年龄4--7岁之间的学生
find({age:{$gte:4,$lte:7}})
查看所有年龄大于4岁并sex是‘m’的学生
find({age:{$gt:4},sex:'m'})
查看所有年龄小于4岁或者大于7岁的学生
find({$or:[{age:{$lt:4}},{age:{$gt:7}}]})
查看所有年龄是4岁或者6岁的学生
find({age:{$in:[4,6]}})
查找所有兴趣爱好有两项的学生
find({hobby:{$size:2}})
查找兴趣爱好有画画的学生
find({hobby:'画画'})
查找兴趣爱好既有画画又有跳舞的学生
find({hobby:{$all:['画画',‘跳舞’]}})
统计兴趣爱好有三项的学生的人数
find({hobby:{$size:3}}).count()
查找本班第二位学生
find().skip(1).limit(1)
将本班学生按年龄升序排列,年龄一样的按姓名升序
db.class.find().sort({age:1})
> db.class.find().sort({age:-1,name:1})
统计本班同学兴趣爱好都覆盖哪些范围
db.collectionName.distinct('hobby')
删除所有年龄不到4岁和大于9岁的同学
remove({$or:[{age:{$lt:4}},{age:{$gt:9}}]})
-------------------------------------------------------------
更新文档
update tablename set .... where ....
db.collectionName.update(query,update,upsert,multi)
功能:更新集合中的文档
参数:query 确定要更新的文档 相当于where
用法见查找
update 将文档更新为什么 相当于set...
upsert boolean 如果为true 则定位的文档不存在就插入一条新的文档,false相反,默认为false
multi boolean 如果为true 则更新所有query定位到的文档,false则更新第一条,默认为false
e.g.
$set 是一个修改器
将姓名为wangwu的文档age改为20,如果不存在age域则自动添加
db.class3.update({name:'wangwu'},{$set:{age:20}})
修改所有name为huairen的age为25
db.class3.update({name:'huairen'},{$set:{age:25}},false,true)
如果name为haoren的文档存在则修改其age为27,如果不存在则插入{name:'haoren',age:27}
db.class3.update({name:'haoren'},{$set:{age:27}},true,false)
-----------------------------------------------------
修改器的使用
$set : 设疑文档中某个域的值
修改age为21,sex为‘w’
db.class3.update({name:'wangwu'},{$set:{age:21,sex:'w'}})
$inc 将某个域的值增加几(如果为负数则为减少)
db.class3.update({name:'wangwu'},{$inc:{age:-2}})
$mul 乘法修改器,将某个域的值乘以多少
将第一条数据的age乘以2
db.class3.update({},{$mul:{age:2}},false,false)
$unset 删除某个域
删除class3集合中第一条文档的age域(age后面0,1均会删除该域)
db.class3.update({},{$unset:{age:1}})
$rename 修改域名
将文档中ag域名字改为age
db.class3.update({},{$rename:{'ag':'age'}})
$min 若匹配到的文档指定域的值小于给出的值则不做修改,如果大于给定的值则修改为给定值
将集合中所有age大于25的值修改为25
db.class3.update({},{$min:{age:25}},false,true)
$max 若匹配到的文档指定域的值大于给出的值则不做修改,如果小于给定的值则修改为给定值
将集合中所有age小于22的值修改为22
db.class3.update({},{$max:{age:22}},false,true)
数组修改器
$push 向数组添加一个值
db.class3.update({},{$push:{course:'Python'}})
$pushAll 向数组中添加多项
db.class3.update({name:'huairen'},{$pushAll:{course:['python','mongodb']}})
$each 添加多项数据
db.class3.update({name:'haoren'},{$push:{course:{$each:['python','java']}}})
$pull 从数组中删除一项
db.class3.update({name:'haoren'},{$pull:{course:'java'}})
$pullAll 从数组中删除多项
db.class3.update({name:'wangwu'},{$pullAll:{course:[123,'Python']}})
$pop 从数组两端弹出数据
删除数组中的最后一项(1)
db.class3.update({name:'huairen'},{$pop:{course:1}})
删除数组中的第一项(-1)
db.class3.update({name:'huairen'},{$pop:{course:-1}})
$addToSet 同push 但是不能有重复
添加一项,但是如果原数组中已有此项则无法添加
db.class3.update({},{$addToSet:{course:'html'}})
关于null
某一个键的值是null
查找publication域是null的文档
db.class2.find({publication:null})
某一个文档不存在这个域
查找不存在publication_date域的文档
db.class2.find({publication_date:null})
文档类型的数据
内部文档数据查找使用
* 按照键值进行匹配
db.class2.find({book:{ "title" : "Python从入门到放弃", "price" : 88 }},{_id:0})
*使用外层键的名词引用内存文档键,查找对应的值
这时查找项必须加引号
db.class2.find({'book.price':88},{_id:0})
db.class2.update({book:{$exists:true}},{$set:{'book.price':60}})
练习:
文档机构同上次
创建一个数据库 名字为 grade
数据库中创建集合集合名称为 class
向集合中插入若干文档文档结构如下
{name:‘小红’,age:10,sex:‘w’,hobby:['a','b']}
1. 将该班中姓名为小红的学生年龄变为8岁,兴趣爱好变为跳舞画画
{$set:{age:8,hobby:['dance','drawing']}}
2. 追加 小明的兴趣爱好,增加唱歌
{$push:{hobby:'sing'}}
3.增加小王兴趣爱好,吹牛和打篮球
{$pushAll:{hobby:['chuiniu','basketball']}}
4.追加小李兴趣爱好,吹牛,唱歌,要保证和原有爱好不重复
{$addToSet:{hobby:{$each:['chuiniu','sing']}}}
5.给该班所有同学年级增加1岁
{$inc:{age:1},false,true}
6.删除小明同学的sex属性
{$unset:{sex:1}}
7.删除小明兴趣爱好中的第一项
{$pop:{hobby:-1}}
8.删除小红兴趣中的画画
{$pull:{hobby:'drawing'}}