mongodb 基础知识(三)

70 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第9天,点击查看活动详情

上一篇中我们了解了mongodb简单的增删改查的操作,这次我们来学习一下mongodb中的一些函数方法以及逻辑符号。

逻辑操作

首先我们准备一些测试数据

> db.product.find()
{ "_id" : ObjectId("62519ac1bd42defeee43f2af"), "price" : 200 }
{ "_id" : ObjectId("62525be9313bc6eb0c50cd9e"), "name" : "菜 刀 ", "price" : 200 }
{ "_id" : ObjectId("62525f17313bc6eb0c50cd9f"), "name" : "电 火 锅 ", "price" : 100, "label" : "网 红 " }
{ "_id" : ObjectId("625295572dca7c1af217bd63"), "name" : "电 火 锅 ", "price" : 300 }
{ "_id" : ObjectId("625295832dca7c1af217bd64"), "name" : "电 火 锅 ", "price" : 300, "label" : "国 产 " }

可以看到里面有三条电火锅的数据。 类比于mysql,我们在组合条件查询的时候会分别使用到and 、or、!这三种逻辑符号,那么在mongodb中是如何使用这些逻辑符号来组合查询的呢。首先如果我们要查询名称是电火锅且价格是300的文档我们应该这样去编写。

> db.product.find({name:'电 火 锅 ',price:300})
{ "_id" : ObjectId("625295572dca7c1af217bd63"), "name" : "电 火 锅 ", "price" : 300 }
{ "_id" : ObjectId("625295832dca7c1af217bd64"), "name" : "电 火 锅 ", "price" : 300, "label" : "国 产 " }

and条件的查询只需要我们用,去组合我们要匹配的条件即可。下面来学习下or条件是如何实现的 比如我们想查询价格是10或者标签是国产的文档

> db.product.find({$or:[{price:100},{label:'国产'}]})
{ "_id" : ObjectId("62525f17313bc6eb0c50cd9f"), "name" : "电火锅", "price" : 100, "label" : "网红" }
{ "_id" : ObjectId("625295832dca7c1af217bd64"), "name" : "电火锅", "price" : 300, "label" : "国产" }

可以发现通过$or操作符加上要匹配的字段组成一个数组即可实现这种或的逻辑 而不等于操作则是这样的写法

> db.product.find({price:{$ne:300}})
{ "_id" : ObjectId("62519ac1bd42defeee43f2af"), "price" : 200 }
{ "_id" : ObjectId("62525be9313bc6eb0c50cd9e"), "name" : "菜 刀 ", "price" : 200 }
{ "_id" : ObjectId("62525f17313bc6eb0c50cd9f"), "name" : "电 火 锅 ", "price" : 100, "label" : "网 红 " }

使用$ne操作符可以达到这样的效果。

排序

在mongodb中排序是使用sort方法,里面添加要排序的参数,1代表升序,-1代表降序。如果是多个的话可以用逗号隔开,这里的逻辑和mysql是一致的,逗号分隔多个参数的排序,在前面的参数排序优先级更高

db.product.find().sort({price:-1})
{ "_id" : ObjectId("625295572dca7c1af217bd63"), "name" : "电 火 锅 ", "price" : 300 }
{ "_id" : ObjectId("625295832dca7c1af217bd64"), "name" : "电 火 锅 ", "price" : 300, "label" : "国 产 " }
{ "_id" : ObjectId("62519ac1bd42defeee43f2af"), "price" : 200 }
{ "_id" : ObjectId("62525be9313bc6eb0c50cd9e"), "name" : "菜 刀 ", "price" : 200 }
{ "_id" : ObjectId("62525f17313bc6eb0c50cd9f"), "name" : "电 火 锅 ", "price" : 100, "label" : "网 红 " }
{ "_id" : ObjectId("6252fd0c5de555c4f719f5f2"), "name" : "毛 巾 ", "price" : 5 }

分页

分页功能也是我们在开发中使用的比较多的一种了。在mysql中

select * from table where a = 1 limit 1,10;

使用了limit,第一个代表跳过几条记录,第二个代表返回多少条。而在mongodb中是分别使用skip()和limit()这两个方法来实现的。skip顾名思义是跳过几条记录,limit也是返回几条记录的意思。

> db.product.find()
{ "_id" : ObjectId("62519ac1bd42defeee43f2af"), "price" : 200 }
{ "_id" : ObjectId("62525be9313bc6eb0c50cd9e"), "name" : "菜 刀 ", "price" : 200 }
{ "_id" : ObjectId("62525f17313bc6eb0c50cd9f"), "name" : "电 火 锅 ", "price" : 100, "label" : "网 红 " }
{ "_id" : ObjectId("625295572dca7c1af217bd63"), "name" : "电 火 锅 ", "price" : 300 }
{ "_id" : ObjectId("625295832dca7c1af217bd64"), "name" : "电 火 锅 ", "price" : 300, "label" : "国 产 " }
{ "_id" : ObjectId("6252fd0c5de555c4f719f5f2"), "name" : "毛 巾 ", "price" : 5 }
> db.product.find().skip(1).limit(1)
{ "_id" : ObjectId("62525be9313bc6eb0c50cd9e"), "name" : "菜 刀 ", "price" : 200 }

聚合

最后介绍一下mongodb中的聚合操作,比如我们熟知的分组。这里和elasticserach中一样都是使用了aggregate方法。举例我们查询每种价格有几个商品

> db.product.aggregate([{$group: {_id:'$price',num:{$sum:1}}}])
{ "_id" : 300, "num" : 2 }
{ "_id" : 100, "num" : 1 }
{ "_id" : 5, "num" : 1 }
{ "_id" : 200, "num" : 2 }

这里使用了group方法来进行分组,指定了分组的字段是price,聚合的函数是sum,并把结果赋值给num。那么最终得到的结果就是每种价格分别有多少件商品。 当然mongodb中的聚合操作多种多样,这里不可能全部一一介绍,在后面的开发中会把使用到的方法记录下来分享给大家。