MongoDB操作指令

一、入门指令
1、查看数据库
show dbs  查看当前有哪些的数据库
use databaseName 进入数据库
show tables/collections 查看当前库下的collection

2、创建数据库
MongoDB 的库是隐式创建,你可以 use 一个不存在的库
然后在该库下创建collection,即可创建库

3、创建collection(也就是表)
db.createCollection('collectionName')  
备注:
collection 允许隐式创建,即 db.collectionName.insert(document);

4、删除collection
db.collectionName.drop() ,

5、删除database
db.dropDatabase();

6、查看帮助信息
db.help();

这里写图片描述

二、基本操作增删改查

1、增:insert

介绍: mongodb存储的是文档,. 文档是json格式的对象
语法: db.collectionName.isnert(document);

①增加单篇文档
db.collectionName.insert({name:'jack'});

②增加单个文档,并指定_id
db.collectionName.insert({_id:1,name:'eric'});

③增加多个文档
db.collectionName.insert([
	{_id:2,name:'dora'},
	{name:'tony'},
	{_id:3,name:'lili',gender:'female',hobby:['Internet','music','swimming']}
]);

这里写图片描述

2、删:remove

语法: db.collection.remove(查询表达式, 选项);
选项是指  {justOne:true/false},是否只删一行, 默认为false,指删除所有

备注:
a.查询表达式依然是个json对象
b.查询表达式匹配的行,将被删掉
c.如果不写查询表达式,collections中的所有文档将被删掉

①删除test表中 id属性值为 1 的文档 
db.test.remove({_id:1});

②删除test表中name属性为tony的文档,只删除1行
db.test.remove({name:'tony'},true);

这里写图片描述

3、改:update

语法: db.collection.update(查询表达式,新值,选项);

例:
db.test.update({name:'lili'},{name:'alex'});
是指选中test表中,name值为lili的文档,并把其文档值改为{name:'alex'},
结果: 文档中的其他列也不见了,改后只有_id和name列了。
即,新文档直接替换了旧文档,而不是修改

如果是想修改文档的某列,可以用$set关键字
db.collectionName.update(query,{$set:{name:'alex'}})

这里写图片描述

修改时的赋值表达式
$set    修改某列的值 {$set:{列名:新值}}
$unset  删除某个列   {$unset:{列名:1}}
$rename 重命名某个列 {$rename:{旧列名:新列名}}
$inc    增长某个列   {$inc:{列名:增加的值}}
$setOnInsert  当upsert为true时,并且发生了insert操作时,可以补充的字段


Option的作用:
{upsert:true/false,multi:true/false}
multi:是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
Upsert:是指没有匹配的行,则直接插入该行(和mysql中的replace一样)

①把news中所有age=21的文档,都修改
db.test.update({age:21},{$set:{age:22}},{multi:true});

②如果有name='eric'的文档,将被修改;如果没有,将添加此新文档
db.test.update({name:'eric'},{$set:{name:'hehe'}},{upsert:true});

4、查: find, findOne

语法: db.collectionName.find(查询表达式,查询的列);
db.collections.find(表达式,{列1:1,列2:1,...});

①查询所有文档 所有内容
db.collectionName.find()

②查询所有文档的name属性 (_id属性默认总是查出来)
db.collectionName.find({},{name:1})

③查询所有文档的gender属性,且不查询_id属性
db.collectionName.find({},{name:1, _id:0})

④查询所有gender属性值为male的文档中的name属性
db.collectionName.find({gender:'male'},{name:1,_id:0});

⑤涉及数组查询,不如列为:array
db.collectionName.find({array:{$elemMatch:{$ne:null}});    #数组不为空
db.collectionName.find({$where:"this.array.length>0"});     #数组不为空
db.collectionName.find({array:{$size:0}})                           #空数组

5、批量往表里面增加/删除相同字段

批量增加语句:
db.getCollection('表名').update({},{$set:{'新增字段':字段初始值}},{multi:true})
批量删除语句:
db.getCollection('表名').update({},{$unset:{'新增字段':字段初始值}},{multi:true})  
或者
db.getCollection('表名').update({},{$unset:{'新增字段':1}},{multi:true})  


例如:
指定类型:db.getCollection('product').update({},{$set:{'orderNum':NumberInt('0')}},{multi:true})
NumberInt 指定是int类型,如果不指定,我这条语句生成的是double类型

示例:
##查询memberPriceType不等于LEVEL且vipMemberPrice等于0,将memberPriceType改为NONE
db.getCollection('product').find({'vipMemberPrice':0,'memberPriceType':{$ne:['LEVEL']}}) 
db.getCollection('product').update({'vipMemberPrice':0,'memberPriceType':{$ne:['LEVEL']}},{$set:{'memberPriceType':'NONE'}},{multi:true})  

##查询memberPriceType不等于LEVEL且vipMemberPrice大于0,将memberPriceType改为UNIFIED
db.getCollection('product').find({'vipMemberPrice':{$gt:0},'memberPriceType':{$ne:['LEVEL']}})
db.getCollection('product').update({'vipMemberPrice':{$gt:0},'memberPriceType':{$ne:['LEVEL']}},{$set:{'memberPriceType':'UNIFIED'}},{multi:true})  

##查询memberPriceType不等于LEVEL且vipMemberPrice不存在,将memberPriceType改为NONE
db.getCollection('product').find({'memberPriceType':{$ne:['LEVEL']},'vipMemberPrice':{$exists:false}}) 
db.getCollection('product').update({'memberPriceType':{$ne:['LEVEL']},'vipMemberPrice':{$exists:false}},{$set:{'memberPriceType':'NONE'}},{multi:true}) 

##使用$or查询vipMemberPrice字段值为0或者不存在该字段的数据
db.getCollection('product').find({$or:[{'vipMemberPrice':0},{'vipMemberPrice':{$exists:false}}]})
db.getCollection('product').update({$or:[{'vipMemberPrice':0},{'vipMemberPrice':{$exists:false}}]},{$set:{'memberPriceType':'NONE'}},{multi:true})


### $or 语法格式
写法:字段1 = 'xxx' or 字段2 in ( 'xxx').....
mongodb:db.B.find({"$or":[{"x":{"$in":['值1','值2'...]}},{"y":"3"}]})

##时间查询,时间有三种类型 Date()、new Date()、 ISODate()
#首次消费时间距今小于等于30天
db.customer.find({"firstBuyDate":{$gte:new Date(2019,6,30)}})

#首次消费时间距今大于30天,90天内有消费
db.customer.find({$and:[{"firstBuyDate":{$lt:new Date(2019,6,30)}},{"lastBuyDate":{$gte:new Date(2019,4,31)}}]}).count()

#首次消费时间距今大于90天,180天内没有消费 
db.customer.find({$and:[{"lastBuyDate":{$lt:new Date(2019,4,31)}},{"lastBuyDate":{$gte:new Date(2019,2,2)}}]}).count() 

#180天以上没有消费
db.customer.find({"lastBuyDate":{$lt:new Date(2019,2,2)}}).count()  

#备注:mongo中时间是按照 0 - 11 月方式来计算的,也就是比本月要小一个数字算

6、Mongo使用for循环

#查询指定数据中,然后对数据进行循环,然后将lastBuyDate的值赋给firstBuyDate字段
db.customer.find({"$and":[{'firstBuyDate':{$exists:false}},{'lastBuyDate':{$exists:true}}]}).forEach(function(item){db.getCollection('customer').update({"_id":item._id},{"$set": {"firstBuyDate":item.lastBuyDate}},{multi:true})})

备注:
如果数据库中没有这个字段,最后用db.getCollection()方法

7、Mongo使用distinct去重

类似于mysql :select count(distinct phone) from customer ;
①直接使用distinct 语句查询, 这种查询会将所有查询出来的数据返回给用户, 然后对查询出来的结果集求总数(耗内存,耗时一些)
格式:db.customer.distinct("去重字段",{条件}).length
示例:db.customer.distinct("phone",{"phone":{"$exists":1}}).length 

备注:使用这种方法查询时,查询的结果集大于16M 时会查询失败,失败信息如下:
{"message" : "distinct failed: MongoError: distinct too big, 16mb cap","stack" : "script:1:20"}


②使用聚合函数,多次分组统计结果,最终将聚合的结果数返回给用户
示例:
db.customer.aggregate([
    {$match:{"phone":{"$exists":1}}},
    {$project:{"phone":true}},
    {$group:{_id:"$phone"}},
    {$group:{_id:null,count:{$sum:1}}}
])

备注:这种查询数据量大时就不会出现如上查询失败的情况,而且这种查询不管是内存消耗还是时间消耗都优于上面一种查询

8、修改缓存大小限制

##默认缓存区限制是32M
use admin
db.auth("adminuser","passwd")
db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: 335544320})  //设置
db.runCommand({getParameter : 1, "internalQueryExecMaxBlockingSortBytes" : 1});  //查询

##在执行一个更大规模排序时,即使已经加了索引依然超过限制
##可以使用aggregate()方法的 allowDiskUse 参数设置将数据写到临时文件进行排序
//语法:pipeline -> array, options -> document
db.collection.aggregate(pipeline, options)
//举例:
db.customer.aggregate(
[
 {$sort : {"createTime" : -1}}
],
 {allowDiskUse: true}
);

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值