Mongodb(2)操作方法

2017/02/04 Mongodb 阅读次数:

摘要:主要写了mongodb数据操作命令,以及注意事项;涉及创建数据库,创建集合,删除集合,运算符,正则表达式,投影,排序,聚合,管道,索引等示例代码

moongodb数据库

创建数据库:

use test1
db.test1.insert({name:"hello"})
#创建数据库的时候,必选要有数据才能查询到

删除数据库

db.dropDatabase()

创建集合,就相当于创建表

 MongoDB 中,你不需要创建集合。当你插入一些文档时,MongoDB 会自动创建集合。
db.test1.insert({name:"创建集合"})
db.createCollection("runoob")
创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个。
db.createCollection("mycol", { capped : true, autoIndexId : true, size :
... 6142800, max : 10000 } )

删除集合

db.test1.drop()


 - 增删改查
    - 插入数据:
      
      db.mymongo.insert({id:1,name:"derek",sex:"nan"})
      db.mymongo.save({"_id":1,"age":234}) 如果存在就会更改对应的值或者添加
      
    - 更新数据,就是改
     
      db.mymongo.update({"name":"hello"},{$set:{"name":"derek"}})
      db.mymongo.update({"name":"wwww"},{$set:{"name":"王亚东"}},{multi:true}) #加上multi,更改多行
      db.stu.update({name:'hr'},{name:'mnc'})   更新一条
      db.stu.update({name:'hr'},{$set:{name:'hys'}})    更新一条
      db.stu.update({},{$set:{gender:0}},{multi:true})   更新全部
    

    - 删除数据  
  
      db.col.remove({}) 删除集合中所有数据
      db.col.remove({"name":"wangyadong"})  删除指定数据
      db.col.deleteMany({status:"A"})  删除等于A的数据
      db.col.deleteOne({status:"A"})  删除等于A的一条数据
    - 查询数据
      db.col.find().pretty()  美化输出
      db.stu.findOne({age:{$nin:[16,18]}})  输入一条数据

比较运算符

db.col.find({likes:{$gt:50}}).pretty()  查询大于50
db.col.find({likes:{$gte:69}}).pretty() 查询大于等于69
db.col.find({likes:{$lt:20}}).pretty()  查询小于20
db.col.find({likes:{$lte:13}}).pretty() 查询小于13
db.col.find({likes:{$ne:13}}).pretty()  查询不等于13

逻辑运算符

db.col.find({$or:[{"likes":13,"likes":612}]}).pretty()  or或,满足一个
db.col.find({title:"MongoDB 教程",likes:69}).pretty()  and与,同时满足

范围运算符

db.stu.find({age:{$in:[16,18]}})   包含1618
db.stu.find({age:{$nin:[16,18]}})   不包含1618

正则表达式

db.stu.find({name:{$regex:"^段"}})  查询以段开头
db.stu.find({name:{$regex:"段"}})  查询包含段
db.stu.find({name:{$regex:"段$"}})  查询以段结尾
db.stu.find({name://})          查询包含段
db.stu.find({name:/^/})          查询以段开头
db.stu.find({name:/段$/})          查询以段结尾

MongoDB 操作符 - $type 实例

db.col.find({title:{$type:2}})   获取集合中的titlestring的数据

limit和skip

db.col.find().limit(2)  查询2条信息
db.stu.find().skip(2)   跳过2条信息
db.stu.find().limit(2).skip(2)  查询2条信息跳过
db.stu.find().skip(2).limit(2)  这两种写法都是先跳后查,用最后一个

投影

db.stu.find({},{_id:0})  第一个 {}  where 条件,为空表示返回集合中所有文档。第二个 {} 指定那些列显示和不显示 0表示不显示 1表示显示)
db.stu.find({age:{$gt:18}},{_id:0,name:1})

排序

#根据性别降序, 再根据年龄升序
db.stu.find().sort({gender:-1,age:1})  1为升序,-1为降序
db.stu.find({},{_id:0,name:1}).sort({age:-1})  查询集合,id不显示,只显示name,按照age降序

统计个数

db.stu.find({age:18}).count()  查询age等于18有几条数据
db.stu.count({age:{$gt:18}})   查询age大于18有几条数据
db.stu.count({age:{$gt:15},gender:false}) 查询age大于15gender等于false

消除重复

⽅法distinct()对数据进⾏去重
db.集合名称.distinct('去重字段',{条件})
db.stu.distinct('hometown',{age:{$gt:18}}) age大于18hometown进行去重 返回一个数组

聚合 aggregate

聚合(aggregate)是基于数据处理的聚合管道,每个文档通过一个由多个阶段(stage)组成的管道,可以对每个阶段的管道进行分组、过滤等功能,然后经过一系列的处理,输出相应的结果。
db.集合名称.aggregate({管道:{表达式}})

常用管道如下:

mongodb中,⽂档处理完毕后, 通过管道进⾏下⼀次处理
$group 将集合中的⽂档分组, 可⽤于统计结果
$match 过滤数据, 只输出符合条件的⽂档
$project 修改输⼊⽂档的结构, 如重命名、 增加、 删除字段、 创建计算结果
$sort 将输⼊⽂档排序后输出
$limit 限制聚合管道返回的⽂档数
$skip 跳过指定数量的⽂档, 并返回余下的⽂档
$unwind 将数组类型的字段进⾏拆分

表达式

处理输⼊⽂档并输出
语法:表达式:'$列名'
常⽤表达式:
$sum 计算总和, $sum:1 表示以⼀倍计数
$avg 计算平均值
$min 获取最⼩值
$max 获取最⼤值
$push 在结果⽂档中插⼊值到⼀个数组中
$first 根据资源⽂档的排序获取第⼀个⽂档数据
$last 根据资源⽂档的排序获取最后⼀个⽂档数据

$ group


#将集合中的文档分组,可用于统计结果
#_id用于分组标识 必须要有,使用某个字段的格式,$字段名
db.stu.aggregate({$group:{_id:"$age",sum:{$sum:1}}})  group分组,对age分组后的数据进行统计
#统计全班人数,和求全班平均年龄
db.stu.aggregate({$group:{_id:"",count:{$sum:1},avg:{$avg:"$age"}}})
#统计全班男女人数
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1}}})
#统计男女平均年龄
db.stu.aggregate({$group:{_id:"$gender",count:{$avg:"$age"}}})

透视数据

将分组后的数据,放进结果集列表中
db.stu.aggregate({$group:{_id:"$gender",count:{$push:"$name"}}})  如果是字段名,结果集只显示这个字段的数据
db.stu.aggregate({$group:{_id:"$gender",count:{$push:"$$ROOT"}}}).pretty()  如果是$$ROOT,它会文档内容放进结果集数组中
根据三个字段分组去重
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}})

需求:统计出每个country/province下的userid的数量(同一个userid只统计一次)
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
{$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
{$project:{_id:0,country:"$_id.country",province:"$_id.province",count:"$count"}}) ### match
用作条件过滤,只输出符合条件的文档
查询年龄大于15的男女人数
db.stu.aggregate({$match:{age:{$gt:15}}},{$group:{_id:"$gender",count:{$sum:1}}})
查询男女人数,输出人数
db.stu.aggregate({$group:{_id:"$gender",count:{$sum:1}}},{$project:{_id:0,count:1}}) ### $sort
对结果进行排序后输出
db.tv3.aggregate({$group:{_id:{country:"$country",province:"$province",userid:"$userid"}}},
{$group:{_id:{country:"$_id.country",province:"$_id.province"},count:{$sum:1}}},
{$project:{_id:0,country:"$_id.country",province:"$_id.province",count:"$count"}},
{$sort:{count:-1}})

limit

限制管道返回的的文档数量
db.stu.aggregate({$limit:2}) ### skip
跳过指定的文档,返回余下的文档
db.stu.aggregate({$skip:3},{$limit:2})
顺序不能乱,先写skip,再写limit ### $unwind
将⽂档中的某⼀个数组类型字段拆分成多条, 每条包含数组中的⼀个值
语法:db.集合名称.aggregate({$unwind:'$字段名称'})
db.t2.aggregate({$unwind:"$size"})

db.t2.aggregate({$unwind:"$tags"},{$group:{_id:null,counter:{$sum:1}}})
{ "_id" : null, "counter" : 3 }

创建索引

之前的方法
db.col.ensureIndex({name:1}) 
最新创建方法
db.col.createIndex({name:1})
#索引对应的值可以不不唯⼀一 创建唯⼀一索引,插入两条一样报错
db.col.createIdenx({name:1},  {unique:true})
db.col.ensureIndex({name: 1}, {unique: true});
#创建复合索引
db.col.createIndex({name:1,age:-1}) 
#使⽤用场景:⼀一个字段不不能够唯⼀一的确定⼀一条数据时

#查看当前集合的所有索引:
db.t1.getIndexes()
#删除索引:
db.t1.dropIndex({'索引名称':1})

Search

    Table of Contents