MongoDB(增、删、改、查),聚合,游标

MongoDB基础

1、增–insert

MongoDB存储的是文档,文档其实就是json格式的对象。

语法:

db.collectionName.isnert(document)

增加单篇文档:

db.collectionName.insert({title:’nice day’})

增加单个文档,并指定_id

db.collectionName.insert({_id:8,age:78,name:’lisi’})

增加多个文档

db.collectionName.insert(
[
{time:'friday',study:'mongodb'},
{_id:9,gender:'male',name:'QQ'}
]
)

2、删–remove

删除’name’=‘zhangsan’

在这里插入图片描述

删除age大于10

在这里插入图片描述

删除age小于11

在这里插入图片描述

大于等于:$gte

小于等于:$lte

不等于:$ne

只删除一个,{justOne:true}

在这里插入图片描述

3、更新–update

语法:

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

如果使用下面语句,不是更新数据,而是更新文档。更新就是用新文档替换旧文档

在这里插入图片描述

所以,update操作想要更新文档内容,必须和更新的操作符配合使用

$set 修改某列的值

在这里插入图片描述

$unset删除某个属性值

在这里插入图片描述

$rename重命名某个属性

在这里插入图片描述

$inc 更改某个列的值

在这里插入图片描述

Option的作用:{upsert:true/false,multi:true/false}

upsert:true/false:默认为false,如果为true,不存在则插入,如果存在就更新。

multi:true/false默认为false,为true时,会更新匹配到的所有数据。

在这里插入图片描述
在这里插入图片描述

4、查–find

语法:

db.collection.find(查询表达式,查询的列)

$nin --> not in

在这里插入图片描述

__id:只有在指定不显示,才会没有,默认都是显示

其他列,默认不显示

指定显示的列,0不显示,1显示

在这里插入图片描述

$all:

指数组所有单元匹配,就是指定的内容都要有,通过一个list来指定

在这里插入图片描述

$exists:

是否含有某个属性

{exists:1} 表示存在指定字段

在这里插入图片描述

{exists:0}表示不存在指定字段

在这里插入图片描述

主键为32的商品

在这里插入图片描述

不属第3栏目的所有商品

($ne)

在这里插入图片描述

本店价格高于3000元商品

($gt)

在这里插入图片描述

取出第4栏目或第11栏目的商品

($in)

在这里插入图片描述

取出100<=价格<=500的商品

($and)

在这里插入图片描述

取出不属于第3栏目且不属于第11栏目的商品( $and $nin 和 $nor分别实现)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

取出价格大于100且小于300,或者大于4000且小于5000的商品
在这里插入图片描述

取出goods_id%5 == 1,即1,6,11,…这样的商品

在这里插入图片描述

5、聚合

db.collection_name.aggregate([{管道1},{管道2},{管道3},...])

查询每个栏目下的商品数量

在这里插入图片描述

查询每个栏目下,价格大于50元的商品个数,并筛选出满足条件的商品的个数大于等于3的栏目

思路:

(1) 筛选出价格大于50

(2) 按cat_id分组,求出每个组下面的商品个数{$sum:1}

(3) 筛选出商品数量大于3

在这里插入图片描述

查询每个栏目下的库存量,并按库存量排序

在这里插入图片描述

{¥sort:{total:1}}

按total这个列排序,1升序,-1降序

查询每个栏目的商品平均价格,并按平均价格由高到低排序

思路:

(1)按栏目分组后,求shop_price的平均值

(2)按平均值排序,升序

在这里插入图片描述

6、游标操作

MongoDB在底层上时用js来实现的,所以可以通过以下代码,在数据库中插入1000条数据。

for (var i=0;i<1000;i++){
db.bar.insert({_id:i+1,title:'hello world'+i,content:'aaa'+i})
}

上面就是js的for循环代码。所以在MongoDB中可以将js代码和数据库做操作指令一起配合使用。

如果数据库中很多数据,执行以下命令:

db.bar.find()

会将所有的数据都查询出来,此时考虑是否可以在查询的时候,像python生成器那样,每次返回一个数据。其实在MongoDB中也有类似生成器这样的东西,叫游标

游标是什么?

通俗的说游标不是查询结果,而是查询的返回资源或者接口,就像python中的生成器,通过这个生成器,可以一次一次的获取每一个资源。

游标的声明:

var curor_name = db.bar.find()

游标的操作:

curor.hasNext()//判断游标是否已经取到尽头
curor.next()//取出游标的下一个单元

例如:

var mycusor = db.bar.find().limit(5)
print(mycusor.next())//会显示是一个bson格式的数据
printjson(mycusor.next())

可以写一个while循环来打印游标结果:

while(mycusor.hasNext()){
		printjson(mycusor.next())
}

游标还有一个toArray()方法,方便可以看到所有行

print(mycusor.toArray())//看到所有行
	print(mycusor.toArray()[2])//看到第二行

注意不要使用toArray(),原因是会把所有的行立即以对象的形式放在内存中,可以再取出少数几行时,使用此功能。

cursor.forEach(回调函数)

var gettile = function(obj){print(obj.goods_name)}
var cursor = db.goods.find()
cursor.forEach(gettile)

游标在分页中的应用

一般的,假设每页N行,当前是page页,就需要跳过(page-1)*N,再取N行,在mysql中,用limit,offset来实现,在MongoDB中,用skip(),limit()函数来实现。

var mycusor = db.bar.find().skip(90).limit(10)//跳过90条,取10条。
var mycursor = db.bar.find().skip(9995);

则是查询结果中,跳过前9995行

查询第901页,每页10条

则是 var mytcursor = db.bar.find().skip(9000).limit(10);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值