MongoDB的基本使用

基本操作
./mongod -f mongodb.conf # 启动mongodb
./mongo  # 进入到mongodb控制台
db.shutdownServer() # 关闭服务[user admin]
db.createUser({user:"root",pwd:"root",roles[{role:"userAdminAnyDatabase", db:"admin"}]}) # user用户名,pwd密码,role角色,db应用在哪个数据库
db.auth("root", "123")
show dbs # 查看所有的数据库
user xxx # 切换数据库
db.sang_collec.insert({x:1}) # 向xxx中的sang_collec集合中插入一条数据
db.sang_collec.insertMany([{x:1}, {x:2}, {x:3}]) # 插入多条数据
db.sang_collec.findOne() #查看一个文档
db.sang_collec.find() #查看所有文档
db.sang_collec.update({x:1},{x:999}) # 将x:1改为x:999
db.sang_collec.remove({x:999}) # 移除x:999
默认使用的是64位浮点型数值
db.sang_collec.insert({x:NumberInt(10)}) # 插入整型值
db.sang_collec.insert({x:NumberLong(12)})
db.sang_collec.insert({x:"hello MongoDB!"}) #直接插入字符串
db.sang_collec.insert({x:[1,2,3,4,new Date()]}) # 插入数组
db.sang_collec.insert({x:new Date()}) # 插入日期
db.sang_collec.insert({name:"三国演义",author:{name:"罗贯中",age:24}}) # 插入内嵌文档
db.sang_collec.find({x:/^(hello)(.[a-zA-Z0-9])+/i}) # 利用正则表达式查询
db.sang_collec.insert({x:function f1(a,b)(return a+b)}) # 插入JavaScript代码

####################################

文档更新操作
db.sang_collec.insert({name:"三国演义",authorName:"罗贯中",authorGender:"男",authorAge:24.0}) # 插入数据
var book = db.sang_collec.findOne({name:"三国演义"}) # 查找三国演义并返回给book
book.author={name:book.authorName,gender:book.authorGender,age:book.authorAges} # 向book中添加元素,新的节点值为旧值
delete book.authorAge
delete book.authorGender
delete book.authorName

db.sang_collec.update({x:1},{$set:{x:99}},false,true) # 将所有的x:1改为x:99, 第一个false表示如果不存在update记录,是否我们要将更新的文档插入作为一个新文档。第二个true表示是否要更新到全部查到的文档
$set修改器:用来修改一个字段的值,如果这个字段不存在,则创建它
db.sang_collec.insert({x:1,y:2,z:3})
db.sang_collec.update({x:1},{$set:{x:99}}) # 只修改x:1为x:99,其他的不变
db.sang_collec.update({x:99}, {$set:{i:99}}) # 没有匹配到则添加
db.sang_collec.update({x:99}, {$unset:{i:99}}) # 删除字段
db.sang_collec.update({name:"三国演义"},{$set:{"author.name":"明代罗贯中"}}) # 只修改author.name这个字段中的值
$inc修改器:用来增加已有键的值,如果该键不存在就新建一个。
db.sang_collec.update({name:"三国演义"},{$inc:{"author.age":1}}) #给年龄增加1岁
数组修改器
db.sang_collec.update({name:"三国演义"},{$push:{comments:"好书"}}) # $push:向已有数组末尾添加元素,要是不存在就创建一个数组
db.sang_collec.update({name:"三国演义"},{$push:{comments:{$each:["111","222","333"]}}}) # 插入多个数据
db.sang_collec.update({name:"三国演义"},{$push:{comments:{$each:["444","555"],$slice:-5}}}) # $slice来固定数组的长度,如果不足5个就全部保留,如果超过5个,则只会保留最新的5个
db.sang_collec.insert({class:"研二"})
db.sang_collec.update({class:"研二"},{$push:{students:{$each:[{name:"张一百",score:100},{name:"张九九",score:99},{name:"张九八",score:98}],$slice:5,$sort:{score:-1}}}}) # $score对数据进行排序,按照成绩降序排列, -1降序,1升序
db.sang_collec.update({name:"三国演义"},{$addToSet:{comments:"好书"}}) # $addToSet表示要插入的值如果存在则不插入,否则插入
db.sang_collec.update({name:"三国演义"},{$pop:{comment:1}}) # $pop用来删除数组中的数据,1表示删除末尾,-1表示删除开头的一条数据
db.sang_collec.update({name:"三国演义", {$pull:{comments:"444"}}}) # $pull用来按条件删除数组中的某个元素
db.sang_collec.update({name:"三国演义"}, {$set:{"comments.0":"999"}}) # 将下标为0的comments修改为999
db.sang_collec.update({comments:"333"}, {$set:{"comments.$":"333-1"}}) # 查询条件查出来333,然后将之修改

#####################################

文档查询操作
db.sang_collec.insertMany([{name:"zs", score:100.0}, {name:"ls", score:90.0}, {name:"ww", score:70.0}, {name:"zl", score:80.0}])
db.sang_collec.find({score:{$lte:100, $gte:90}})  #查询score大于等于90,小于等于100的。 $lt < ; $lte <= ;  $gt > ; $gte >= ; $ne !=;
db.sang_collec.find({x:{$in:[1,2]}}) # $in查询x为1或者2的所有文档
db.sang_collec.find({x:{$nin:[1,2]}}) # $nin查询x不为1或者2的所有文档
db.sang_collec.find({$or:[{x:1}, {y:99}]}) # $or查询x为1或者y为99的文档
db.sang_collec.find({x:{$type:1}}) # $type:根据x的类型查询,1表示Double类型,2表示String类型....
db.sang_collec.find({x:{$not:{$type:1}}}) # $not取反操作
db.sang_collec.find({$and:[{y:{$gt:98}},{y:{$lt:100}}]}) # $and类似于and操作
db.sang_collec.find({y:{$lt:100, $gt:98}})

db.sang_collec.find({z:null}) # 查询z为null的数据,不存在z字段的文档也会被查出来
db.sang_collec.find({z:{$in:[null], $exists:true}}) # 查询z为null的数据,不存在z字段的不会被查出来
数组查询
db.sang_collec.insert({books:["三国演义","水浒传","红楼梦"]})
db.sang_collec.find({books:"三国演义"}) # 查询还有三国演义的文档
db.sang_collec.find({books:{$all: ["三国演义","红楼梦"]}}) # 查询包括三国演义和红楼梦的文档
db.sang_collec.find({"books.1":"水浒传"}) # 查询下标1为水浒传的文档
db.sang_collec.find({books:{$size:3}}) # 查询数组长度为3的文档
db.sang_collec.find({},{books:{$slice:2}}) # 查询数组中的前两条数据

db.sang_collec.insert({x:[5.0, 25.0]})
db.sang_collec.find({x:{$lt:20, $gt:10}}) # 查询10-20之间的文档,发现上边查询的还被查出来了,这是因为5<20,而25>10
db.sang_collec.find({x:{$elemMatch:{$lt:20, $gt:10}}})

db.sang_collec.insertMany([{x:1.0}, {y:{z:2.0, k:3.0}}])
db.sang_collec.find({y:{z:2, k:3}})
db.sang_collec.find({"y.z":2, "y.k":3}) # 更加灵活

var cursor = db.sang_collec.find();  # 利用游标进行遍历
while(cursor.hasNext()){
  print(cursor.next())
}
cursor.forEach(function(x){
  print(x)
})

var cursor = db.sang_collec.find().limit(3) # 查询前三条结果
var cursor = db.sang_collec.find().skip(2).limit(4) # 获取到2-5条记录
var cursor = db.sang_collec.find().sort({x:-1}) # 按x排序

#####################################

索引创建
db.sang_collec.getIndexes()  # 查看一个集合中的索引
db.sang_collec.ensureIndex({x:1}, {name:"myfirstindex"}) # 给x字段添加索引,1表示升序,-1表示降序

# dropDups:表示创建唯一性索引时如果出现重复,则将重复的删除,只保留一个
# background是否在后台创建索引,在后台创建索引不影响数据库当前的操作,默认为false
# unique是否创建唯一索引,默认false
# sparse对文档中不存在的字段是否不起用索引,默认false
# v表示索引的版本号,默认为2
# weights表示索引的权重
db.sang_collec.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999})
查看索引
db.sang_collec.getIndexes()
db.sang_collec.totalIndexSize() # 查看索引的大小
删除索引
db.sang_collec.dropIndex("xxx") # 按照索引的名称xxx删除指定索引
db.sang_collec.dropIndexes() # 删除所有的索引
复合索引
db.sang_collec.ensureIndex({x:1, y:-1})
过期索引
db.sang_collec.ensureIndex({time:1}, {expireAfterSeconds:30}) # 过期索引,索引过期之后对应的数据会被删除
全文索引
# 不支持中文
db.sang_collect.ensureIndex({x:"text"})  # 建立一个全文索引
db.sang_collect.find({$text:{$search:"Java"}}) # 查询包含java的问大哥
db.sang_collect.find({$text:{$search:"\"Java C#\""}}) # 查询包含Java和C#的文档
db.sang_collect.find({$text:{$search:"PHP Python"}}) # 查询包含PHP或Python的文档
db.sang_collect.find({$text:{$search:"PHP Python -Java"}}) # 查询包含PHP或Python,但不包括Java的文档
db.sang_collect.find({$text:{$search:"PHP Python"}},{score:{$meta:"textScore"}}) # 查询结果相似度
db.sang_collect.find({$text:{$search:"PHP Python"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) # 查询结果相似度并按照相似度进行排序
地理空间索引
# 2d索引:用来存储和查找平面上的点
db.sang_collect.insert({x:[90,0]})  
db.sang_collect.ensureIndex({x:"2d"}) # 创建2d索引
db.sang_collect.find({x:{$near:[90,0]}}) # 查询该点附近的点,默认是100个 
db.sang_collect.find({x:{$near:[90,0],$maxDistance:99}}) # $maxDistance甚至额返回的最远距离
db.sang_collect.find({x:{$geoWithin:{$box:[[0,0],[91,1]]}}}) # $geoWithin查询某个形状内的点,$box表示矩形
db.sang_collect.find({x:{$geoWithin:{$center:[[0,0],90]}}}) # 查询圆中的点,参数分别表示圆的圆心和半径
db.sang_collect.find({x:{$geoWithin:{$polygon:[[0,0],[100,0],[100,1],[0,1]]}}}) # 查询多边形中的点
2d Sphere索引:是哦也能够与球面类型的地图,它的数据格式是GeoJSON类型的
db.sang_collect.ensureIndex({location:"2dsphere"})

########################################

固定集合
db.createCollection("my_collect", {cpdd:true, size=10000, max:100}) # capped:true表示该集合为一个固定大小的集合,size表示集合大小,max表示集合中文档的最大数量
db.runCommand({convertToCapped:"sang_collec", size:10}) # 将一个普通集合转换为固定集合
固定集合的自然排序
# 固定集合中的文档是按照文档被插入的顺序保存的,自然顺序也就是文档的插入顺序
db.sang_collce.find().sort({$natural:1})

#######################################

管道操作
# $match
db.sang_collec.aggregate({$match:{author:"杜甫"}}) # 获取集合中所有author为"杜甫"的文档

# $project:用来提取想要的字段
db.sang_collec.aggregate({$project:{title:1,_id:0}}) # 1表示要该字段,0表示不要该字段
db.sang_collec.aggrgate({$project:{"articleTitle","$title"}}) # 将title重命名为articleTitle

db.sang_collec.insert({orderAddressL:"ShenZhen", prodMoney:45.0, freight: 13.0, discounts: 3.0, orderDate: ISODate("2017-10-31T09:27:17.342Z"), prods:["可乐", 奶茶]})
db.sang_collec.aggregate({$project:{totalMoney:{$add:["$prodMoney","$freight"]}}}) # 商品费+运费
db.sang_collec.aggregate({$project:{totalPay:{$subtract:[{$add:["$prodMoney","$freight"]},"$discounts"]}}}) # 总费用-折扣
db.sang_collec.aggregate({$project:{"年份":{$year:"$orderDate"},"月份":{$month:"$orderDate"},"一年中第几周":{$week:"$orderDate"},"日期":{$dayOfMonth:"$orderDate"},"星期":{$dayOfWeek:"$orderDate"},"一年中第几天":{$dayOfYear:"$orderDate"},"时":{$hour:"$orderDate"},"分":{$minute:"$orderDate"},"秒":{$second:"$orderDate"},"毫秒":{$millisecond:"$orderDate"},"自定义格式化时间":{$dateToString:{format:"%Y年%m月%d %H:%M:%S",date:"$orderDate"}}}}) # 提取出来时间

db.sang_collec.aggregate({$project:{addr:{$substr:["$orderAddressL",0,2]}}})  # 字符串的截取操作
db.sang_collec.aggregate({$project:{test:{$cmp:["$freight","$discounts"]}}})  # 比较两个数字的大小
```shell
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值