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