mongodb 增删改查


插入文档 (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})



$gte     大于等于
db.class2.find({age:{$gte:12}},{_id:0})



$eq      等于     

 db.class2.find({age:{$eq:12}},{_id:0})

* 等价于 db.class2.find({age:12},{_id:0})


$ne      不等于
db.class2.find({name:{$ne:'zhang'}},{_id:0})


$in      是否包含
db.class2.find({age:{$in:[10,11,12,13]}},{_id:0})
*只要值在数据范围内的都显示出来


$nin     是否不包含
db.class2.find({age:{$nin:[10,11,12]}},{_id:0})


逻辑条件组合  


$and 逻辑与


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'}}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值