MongoDB操作基础命令

MongoDB CRUD与全文索引

概要:
  1. 数据的新增的方式
  2. 数据的查询
  3. 数据的修改删除
  4. 全文索引查询

mongo shell 是一个js 控台,可以执行js 相关运算如:

> 1+1
2
> var i=123;
> print(i)
123
>

数据库与集合的基础操作

  #查看数据库
  show dbs;
  #切换数据库
  use luban;
  #创建数据库与集合,在插入数据时会自动 创建数据库与集和
  db.friend.insertOne({name:"bryce",sex:"1"});
  #查看集合
  show tables;
  show collections;
  #删除集合
  db.friend.drop();
  #删除数据库
  db.dropDatabase();
  1. 数据的新增的方式

关于Mongodb数据插入的说明

  1. 数据库的新增不需要序先设计模型结构,插入数据时会自动创建。
  2. 同一个集合中不同数据字段结构可以不一样

插入相关方法:

插入单条
db.friend.insertOne({name:"bryce",sex:"1"});
插入多条
db.friend.insertMany([
{name:"bryce",sex:"1"},{name:"jack",sex:"1",age:18,birthday:new Date("1996-11-02")}
]);
指定ID
db.friend.insert([
		{_id:1,name:"bryce",sex:"1",age:1},
		{_id:2,name:"jack",sex:"2",birthday:new Date("1988-11-11")}
 ])

2、数据的查询

概要:

  1. 基于条件的基础查询
  2. a n d 、 and、 andor、 i n 、 in、 ingt、 g t e 、 gte、 gtelt、$lte 运算符
  3. 基于 sort skip limit 方法实现排序与分页
  4. 嵌套查询
  5. 数组查询
  6. 数组嵌套查询

基础查询:

基于ID查找
db.emp.find({_id:1101})
基于属性查找
db.emp.find({"name":"bryce"})
运算 与大于 运算
db.emp.find({"job":"IT","salary":{$gt:6000}})
in 运算
db.emp.find({"job":{$in:["IT","teacher"]}})
or 运算
db.emp.find({$or:[{job:"IT"},{job:"teacher"}] })

排序与分页:

sort skip limit

db.emp.find().sort({dep:1,salary:-1}).skip(5).limit(2)

嵌套查询:

基于复合属性查找 时必须包含其所有的值 并且顺序一至
db.student.find({grade:{redis:87,zookeper:85,dubbo:90} })
基于复合属性当中的指定值 查找。注:名称必须用双引号
db.student.find({"grade.redis":87});
db.student.find({"grade.redis":{"$gt":80}});

数组查询:

数据插入
db.subject.insertMany([
{_id:"001",name:"张三",subjects:["redis","zookeper","dubbo"]},
{_id:"002",name:"李四",subjects:["redis","Java","mySql"]},
{_id:"003",name:"王五",subjects:["mySql","zookeper","bootstrap"]},
{_id:"004",name:"赵六",subjects:["Java","dubbo","Java"]},
])
与嵌套查询一样,必须是所有的值 并且顺序一至
db.subject.find({subjects:["redis","zookeper","dubbo"]})
$all 匹配数组中包含该两项的值。注:顺序不作要求
db.subject.find({subjects:{"$all": ["redis","zookeper"]}})
简化数组查询
db.subject.find({subjects:"redis"})
简化数组查询 ,匹配数组中存在任意一值。与$all相对应
db.subject.find({subjects:{$in: ["redis","zookeper"]}})
数组嵌套查询:
基础查询 ,必须查询全部,且顺序一至
db.subject2.find({subjects:{name:"redis",hour:12} })
指定查询第一个数组 课时大于12
db.subject2.find({"subjects.0.hour":{$gt:12}})
查询任科目 课时大于12
db.subject2.find({"subjects.hour":{$gt:12}})
$elemMatch 元素匹配,指定属性满足,且不要求顺序一至
db.subject2.find({subjects:{$elemMatch:{name:"redis",hour:12}}})
数组中任意元素匹配 不限定在同一个对象当中
db.subject2.find({"subjects.name":"mysql","subjects.hour":120})
利用游标遍历查询数据
var persons = db.persons.find();
    while(persons.hasNext()){
        obj = persons.next();
        print(obj.name) 
    }

游标几个销毁条件
1).客户端发来信息叫他销毁
2).游标迭代完毕
3).默认游标超过 10 分钟没用也会别清除

高级查询选项

1)$query 
2)$orderby
3)$maxsan:integer 最多扫描的文档数
4)$min:doc 查询开始 
5)$max:doc 查询结束
6)$hint:doc 使用哪个索引
7)$explain:boolean 统计
8)$snapshot:boolean 一致快照
位置索引查询

1、查询点(70,180)最近的 3 个点

db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)

2、查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点

db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})

3、查询出以圆心为(56,80)半径为 50 规则下的圆心面积中的点

db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1})
Count+Distinct+Group

1、count 查询结果条数

db.persons.find({country:"USA"}).count()

2、Distinct 去重
请查询出 persons 中一共有多少个国家分别是什么

# key 表示去重的键 
db.runCommand({distinct:"persons",key:"country"}).values

3、group 分组

db.runCommand({ group:{
    ns:"集合的名字",
    key:"分组键对象", 
    initial:"初始化累加器",
    $reduce:"分解器",
    condition:"条件",
    finalize:"组完成器" 
}})

分组首先会按照 key 进行分组,每组的 每一个文档全要执行$reduce 的方法,他接收 2 个参数一个是组 内本条记录,一个是累加器数据.
请查出 persons中每个国家学生数学成绩最好的学生信息(必须在 90 以上)

db.runCommand({
    group:{
        ns:"persons",
        key:{"country":true},
        initial:{m:0},
        $reduce:function(doc,prev){
        if(doc.m>prev.m){ 
        prev.m = doc.m; 
        prev.name = doc.m;
        prev.country = doc.country;
        } },
        condition:{m:{$gt:90}}, 
        finalize:function(prev){ 
            prev.m = prev.name+" comes from "+prev.country+" ,Math score is "+prev.m; 
        }} 
})

其它查询

查询服务器版本号和主机操作系统
db.runCommand({buildInfo:1})
查询执行集合的详细信息,大小,空间,索引等
db.runCommand({collStats:"persons"})
查看操作本集合最后一次错误信息
db.runCommand({getLastError:"persons"})

固定集合

特性
    固定集合默认是没有索引的就算是_id 也是没有索引的
    由于不需分配新的空间他的插入速度是非常快的
    固定集合的顺序是确定的导致查询速度是非常快的
    最适合就是日志管理
创建固定集合
创建一个新的固定集合要求大小是 100 个字节,可以存储文档 10 个
db.createCollection("mycoll",{size:100,capped:true,max:10})
把一个普通集合转换成固定集合
db.runCommand({convertToCapped:"persons",size:1000})
对固定集合反向排序,默认情况是插入的顺序排序
db.mycoll.find().sort({$natural:-1})

3、数据的修改与删除

修改
设置值
第三个参数为 true 则执行 insertOrUpdate 操作,查询出则更新,没查出则插入,
db.emp.update({_id:1101} ,{ $set:{salary:10300},true })
自增
db.emp.update({_id:1101} ,{ $inc:{salary:200}})
$unset:删除指定键
db.emp.update({_id:1101},{$unset:{age:1}})
$push:数组键操作:
1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;
原文档为:{ "_id" : ObjectId("5c6e02f6f578476166df7db3"), "name" : "bryce" }
#执行语句
db.emp.update({"name":"bryce"},{"$push": {"score":{"$each":[ {math:90},
{art:80} ] } } } );
#文档变为
{ "_id" : ObjectId("5c6e02f6f578476166df7db3"), "name" : "bryce", "score" : [ { "math" : 90 }, { "art" : 80 } ] }
$addToSet : 当指定的数组中有这个值时,不插入,反之插入 classes为数组名
db.emp.update({name:"zhangsan"},{$addToSet:{classes:"English"}}) ;
$pop:删除指定数组的值,当 value=1 删除最后一个值,当 value=-1 删除第一个值
db.emp.update({name:"zhangsan"},{$pop:{classes:1}})
$pull : 删除指定数组指定的值
#$pullAll 批量删除指定数组
db.emp.update({name:"zhangsan"},{$pull:{classes:"Chinese"}})
#若数组中有多个 Chinese,则全删除
db.emp.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}})
$ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:
db.emp.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male "}})
只会更新第一条
db.emp.update({"dep":"销售部"},{$inc:{salary:100}})
更新所有 匹配的条件
db.emp.updateMany({"dep":"销售部"},{$inc:{salary:100}})

删除:


// 基于查找删除
db.emp.deleteOne({_id:1101})
// 删除整个集合
db.project.drop()
// 删除库
db.dropDatabase()
MongoDB 索引
1.1创建索引
db.books.ensureIndex{{number:1}}

创建索引同时指定索引的名字

db.books.ensureIndex({number:1},{name:"book_"})

1.2索引使用需要注意的地方

1)创建索引的时候注意 1 是正序创建索引-1 是倒序创建索引
2)索引的创建在提高查询性能的同时会影响插入的性能,对于经常查询少插入的文档可以考虑用索引
3)符合索引要注意索引的先后顺序
4)每个键全建立索引不一定就能提高性能,索引不是万能的
5)在做排序工作的时候如果是超大数据量也可以考虑加上索引 用来提高排序的性能

1.3 唯一索引

解决文档books不能重复插入重复的数值

1.4、剔除重复值
#插入相同的 name 值会报错
db.books.ensureIndex({name:-1},{unique:true})

4、全文索引

索引的创建

db.project.createIndex({name:"text",description:"text"})

基于索引分词进行查询

db.project.find({$text:{$search:"java jquery"}})

基于索引 短语

db.project.find({$text:{$search:"\"Apache ZooKeeper\""}})

过滤指定单词

db.project.find({$text:{$search:"java apache -阿里"}})

查看执行计划

db.project.find({$text:{$search:"java -阿里"}}).explain("executionStats")

MongoDB聚合操作

findAndModify: 
{
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值