MongoDB Shell操作

目录

1 数据库操作

2 集合操作

3 文档操作

3.1 插入文档(insert|insertOne|insertMany)

3.2插入、删除的循环操作

3.2 删除文档(remove|deleteOne|deleteMany)

3.3 更新文档(update|save)

3.4 查询文档(find)

4 游标

5 索引

6 聚合



1 数据库操作

        当新创建的数据库里没有插入数据时,并不会被查询到相应的信息,只有插入数据的数据库才会显示其相应的信息。

        在对某个数据库进行相关操作时,需先使用use命令选择执行该数据库。

#创建数据库myDB(use命令在数据库已存在时就是选择执行,否则就是创建)
use myDB

#查看数据库
show dbs

#选择执行myDB数据库
use myDB

#统计数据信息
db.stats()

#查看当前数据库下的所有集合
show collections
db.getCollectionNames()

#删除当前数据库
db.dropDatabase()

2 集合操作

?普通集合操作

#创建集合
db.createCollection("myCollection")  //显式创建myCollection
sb.stu.insert({name: "jack"})        //隐式创建stu

#查询集合
show collections

#查看集合的详细信息
db.getCollectionInfos()

#集合重命名
db.myCollection.renameCollection("myColl")

#查看集合统计信息
db.myCollecyion.stats()

#删除集合
db.myCollection.drop()

?定长集合操作

#定长集合的创建
db.createCollection("myCollection",{capped:true,size:3})

#判断集合是否为定长集合
db.myCollection.isCapped()

#普通集合转定长集合
db.runCommand({convertToCapped:"stu1",size:100})

3 文档操作

3.1 插入文档(insert|insertOne|insertMany)

#向stu集合插入一个文档
db.stu.insert({item: "card",qty: 15})

#向stu集合插入多个文档
db.stu.insert(
    [{item: "card",qty: 15},
    {item: "card1",qty: 16},
    {item: "card2",qty: 17}]
)

#使用变量方式插入多个文档
document=[{item: "card",qty: 15},{item: "card1",qty: 16},{item: "card2",qty: 17}]
db.stu.insert(document)

#insertOne只能用来一次插入一个文档
#insertMany可以用来一次插入多个文档
#具体用法与insert的一样

3.2插入、删除的循环操作

 ?循环插入10条数据
for(var i=1,age=20;i<=10;i++,age++)db.stu.insert({name:"jack"+i,age:age})

?将一个集合的数据插入到另一个新建集合
db.stu1.find().forEach(function(x)){db.stu2.insert(x);}

?循环修改集合中的文档数据

for(var i=6;i<=10;i++)db.stu2.update({"name":["jack"+i,"tom"+i]},{$set:{"name":"tom"+i}})

3.2 删除文档(remove|deleteOne|deleteMany)

#删除stu数据库中满足条件的所有文档
db.stu.remove({条件})

#删除stu数据库中满足条件的一条文档
db.stu.remove({条件},justOne:true)

#删除stu集合下的所有文档
db.stu.deleteMany({})

#删除stu集合下的所有满足条件的文档
db.stu.deleteMany({条件})

#删除stu集合下的所有满足条件的一条文档
db.stu.deleteMany({条件})

3.3 更新文档(update|save)

db.集合名.update({条件},{$set:{字段名:修改后的值}})

#将stu集合中item为card的文档中qty值修改为35
db.stu.update(
    {item: "card"},
    {$set: {qty: 35}}
)

#save命令进行更新
db.stu.save("_id": 10,item: "card",qty: 35})

save与update命令的区别

  • save按_id进行匹配查找,修改的文档若存在就进行修改,若不存在则创建该文档并插入集合
  • update按条件匹配查找,修改的文档若存在就进行修改,若不存在则会抛异常

3.4 查询文档(find)

比较条件 符号 事例
等于 : db.stu.find({price:24})
大于 $gt: db.stu.find({price:{$gt:24}})
小于 $lt: db.stu.find({price:{$lt:24}})
大于等于 $gte: db.stu.find({price:{$gte:24}})
小于等于 $lte: db.stu.find({price:{$lte:24}})
不等于(数值) $ne: db.stu.find({price:{$ne:24}})
不等于(字符串) $not: db.stu.find({name:{$not:"《MongoDB 教程》"}})
{ , ,} db.stu.find({price:{$gt:24}},{name:"《MongoDB教程》"})
$or{ , ,} db.stu.find({$or:[{price:{$gt:24}},{name:"《MongoDB教程》"}]})
包含 $in: db.stu.find({price:{$in:[23,24,25]}})
不包含 $min: db.stu.find({price:{$nin:[23,24,25]}})
包含元素个数 $size:

tags属性中值为数组且包含三个元素的

db.stu.find(tags:{$size:3}})

配合find使用的其它方法

#age:null不仅会匹配到age的值为null的文档,还会匹配到不包含age这个键的文档。
db.stu.find({age:null})

#限制返回值
db.stu.find().limit(3)

#指定跳过第几个文档
db.stu.find().skip(3)     //跳过第三个

#查询结果排序
查询结果按照指定属性升序显示(-1降序)
db.stu.find().sort({"属性":1})

4 游标

        db.stu.find()返回的就是一个游标,可以声明一个变量进行接收,它是数据遍历过程中的内部指针,是数据读取的接口。

        游标使用find方法返回,故上面说到配合find方法使用的sort、limit、skip等方法也可以使用,此外还有hint方法(强制使用索引进行查询)。

#声明游标并进行遍历
var cursor = db.stu.find()    //声明游标
while (cursor.hasNext()){     //判断游标的下一位有没有值
    var doc = cursor.next();  //有值的情况下在声明变量进行接收
    print(doc.name);          //
    print(doc);               //输出的是一条BSON类型的数据
    printjson(doc);           //转成JSON的形式输出
    print(tojson(doc));       //同上一行效果
}

5 索引

        什么叫索引呢?在没有索引的情况下,用户要是想要查询某个文档的话就必须扫描集合中的所有文档,来选择与查询条件相匹配的文档。然而,在有索引存在的情况下,用户可以先查询索引中是否有想要查询的文档,如果有的情况下就可以直接读,从而节约了大量的时间。

        索引的优点:提升文档的查询速率。相对而言,因为插入新的文档会引起索引顺序的重拍,从而会降低插入、更新的速率。

        MongoDB的索引基于B-tree数据结构,MySQL的索引基于B+tree数据结构。

#单索引
对stu集合中的score字段创建升序索引(-1降序)
索引名为:index1(索引名默认为字段名_1)
db.stu.createIndex({score:1},name:"index1")

#复合索引
对stu集合中的score字段创建升序索引,state降序索引
db.stu.createIndex({score:1,state:-1})

#唯一索引
对stu集合中的score字段创建升序唯一索引
db.stu.createIndex({score:1},{unique:true})

#查询stu集合的所有索引
db.stu.getIndexes()

#查询索引所占空间大小
db.stu.totalIndexSize()

#删除索引
索引的所有属性都不能有所不同,否则会删错索引,或提示无此索引
db.stu.dropIndex({score:1})
删除除_id索引外的所有索引
db.stu.dropIndexes()

#修改索引
先删除需要修改的索引,在创建一个修改后的索引

6 聚合

对返回的文档进行统计分析,使用aggregate方法实现。

?管道操作:$match(过滤) $group(分组) $project(显示字段) $sort(排序) $limit(限制) $skip(跳过)

?聚合运算符: $sum(求和) $avg(均值) $min(最小值) $max(最大值) $first $last $push

#只显示stu集合里文档的quantity和pnumber字段
db.stu.aggregate({$project:{quantity:1,pnumber:1,price:0}})

#过滤出stu集合里price大于4.0的所有文档
db.stu.aggregate({$match:{price:{$gt:4.0}}})

#对price字段升序排列
db.stu.aggregate({$sort:{price:1}})

#返回stu集合的前三个文档并跳过第一项
db.stu.aggregate({$limit:3},{$skip:1})

分组求和的两种方式

#管道聚合
按编号分组,并统计商品数量
db.stu.aggregate([{$group:{_id:"$pnumber",total:{$sum:"$quantity"}}}])


#MapReduce
var mapFunc = function(){
emit(this.pnumber,this.quantity);
};

var reduceFunc = function(key,values){
return Arrary.sum(values);
};

db.stu.mapReduce(mapFunc,reduceFunc,{out:{replace:'result'}})    //创建一个集合用来接收结果

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码

)">
< <上一篇
下一篇>>