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}})   获取集合中的title为string的数据

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大于15且gender等于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