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’

mongodb unwind用法 mongodb union_mongodb unwind用法

删除age大于10

mongodb unwind用法 mongodb union_生成器_02

删除age小于11

mongodb unwind用法 mongodb union_mongodb unwind用法_03

大于等于:$gte

小于等于:$lte

不等于:$ne

只删除一个,{justOne:true}

mongodb unwind用法 mongodb union_数据_04

3、更新–update

语法:

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

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

mongodb unwind用法 mongodb union_数据_05

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

$set 修改某列的值

mongodb unwind用法 mongodb union_数据库_06

$unset删除某个属性值

mongodb unwind用法 mongodb union_数据库_07

$rename重命名某个属性

mongodb unwind用法 mongodb union_mongodb unwind用法_08

$inc 更改某个列的值

mongodb unwind用法 mongodb union_mongodb unwind用法_09

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

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

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

mongodb unwind用法 mongodb union_mongodb unwind用法_10


mongodb unwind用法 mongodb union_数据_11

4、查–find

语法:

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

$nin --> not in

mongodb unwind用法 mongodb union_生成器_12

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

其他列,默认不显示

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

mongodb unwind用法 mongodb union_数据库_13

$all:

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

mongodb unwind用法 mongodb union_数据库_14

$exists:

是否含有某个属性

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

mongodb unwind用法 mongodb union_数据库_15

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

mongodb unwind用法 mongodb union_生成器_16

主键为32的商品

mongodb unwind用法 mongodb union_mongodb unwind用法_17

不属第3栏目的所有商品

($ne)

mongodb unwind用法 mongodb union_数据_18

本店价格高于3000元商品

($gt)

mongodb unwind用法 mongodb union_mongodb unwind用法_19

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

($in)

mongodb unwind用法 mongodb union_生成器_20

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

($and)

mongodb unwind用法 mongodb union_mongodb unwind用法_21

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

mongodb unwind用法 mongodb union_数据库_22


mongodb unwind用法 mongodb union_mongodb unwind用法_23

mongodb unwind用法 mongodb union_生成器_24

取出价格大于100且小于300,或者大于4000且小于5000的商品

mongodb unwind用法 mongodb union_数据_25

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

mongodb unwind用法 mongodb union_生成器_26

5、聚合

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

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

mongodb unwind用法 mongodb union_mongodb unwind用法_27

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

思路:

(1) 筛选出价格大于50

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

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

mongodb unwind用法 mongodb union_数据库_28

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

mongodb unwind用法 mongodb union_数据库_29

{¥sort:{total:1}}

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

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

思路:

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

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

mongodb unwind用法 mongodb union_生成器_30

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);