写这篇文章的目的是:方便自己查阅,当然,如果可以帮到你,真的很开心
1.刚听说公司要用MongoDB的时候,是很晕的,一是不知道如何着手查询,因为完全不同于SQL的方式,二是不知道为什么要用MongoDB,好在哪里
2.后来查阅了资料,了解MongoDB的发展史、工作原理、选举机制、聚合框架、常用操作查询、设计模式等等,有了初步的概念
当然这些不作为本文的重点,重点讲一下常用的操作查询
3.常用查询如下
一、对比SQL
查询条件对照表
|
SQL |
MQL |
|
a=1 |
{a:1} |
|
a<>1 |
{a:{$ne:1}} |
|
a<1 |
{a:{$lt:1}} |
|
a>1 |
{a:{$gt:1}} --greater than |
|
a<=1 |
{a:{$lte:1}} |
|
a>=1 |
{a:{$gte:1}} --greater than equal |
查询逻辑对照表
|
SQL |
MSQL |
|
a=1 AND b=1 |
{a:1,b:1} 或 {$and:[{a:1},{b:1}]} |
|
a=1 OR b=1 |
{$or:[{a:1},{b:1}]} |
|
a is NULL |
{a:{$exists:false}} |
|
a in (1, 2, 3) |
{a:{$in:[1,2,3]}} |
|
a is not in (1, 2, 3) |
{a:{$nin:[1,2,3]}} |
1.添 insertOne ()<-->insert into
操作格式:
db.<集合>.insertOne(<JSON对象>)
db.<集合>.insertMany([<JSON 1>,<JSON2>,<JSON 3>,<JSON n>])
示例:
db.users.insertOne({name:”Lisa”})
db.users.insertMany([
{name:”Amy”},
{name:”Lucky”},
{name:”Nancy”}
])
2.删 remove()<-->delete
使用remove删除文档
*remove需要配合查询条件使用
*匹配查询条件的文档会被删除
*指定一个空文档会删除所有文档
db.users.remove({name:"Lisa"}) //删除name=Lisa的记录
3.改 update()<-->update table set...
*update操作的执行格式:db.<集合>.update(<查询条件>,<更新字段>)
db.fruits.insertMany([{name:"apple"},{name:"orange"},{name:"pear"}])
db.fruits.updateOne({name:"apple"},{$set:{from:"China"}})
*使用updateOne表示无论条件匹配多少条记录,始终更新第一条
*使用updateMany表示条件匹配多少条就更新多少条
*upadateOne/updateMany方法,要求更新条件部分必须满足下面八个之一,否则会报错
$set
$unset
使用update更新数组
$push:增加一个对象到数组底部
$pushAll:增加多个对象到数组底部
$pop:从数组底部删除一个对象
$pull:如果匹配指定的值,从数组中删除相应的对象
$pullAll: 如果匹配任意的值,从数组中删除相应的对象
$addToSet:如果不存在则增加一个值到数组
示例:
db.fruits.updateOne({name:"apple"},{from:"China"})
4.查 find()<-->select
关于find:
*find是MongoDB中查询数据的基本指令,相当于SQL中的select
*find返回的是游标
游标是什么意思:游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL的执行结果。每个游标区都有一个名字。用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理
一般需要对查询的结果集中的数据再进行二次处理才会用到
find示例
db.movies.find({“year”:1975}) //单条件查询
db.movies.find({“year”:1989,”title”:”Batman”}) //多条件and查询
db.movies.find({$and:[{“year”:1989},{“title”:”Batman”}]}) //and的另一种形式
db.movies.find({$or:[{“year”:1989},{“title”:”Batman”}]}) //多条件or查询
Db.movies.find({“title”:”/^B/”}) //按正则表达式查找 (大写B开头的)
二、MongoDB的聚合查询
什么是MongoDB聚合框架
.MongoDB聚合框架(Aggregation Framework)是一个计算框架,它可以:
*作用在一个或几个集合上;
*对集合中的数据进行的一系列运算;
*将这些数据转化为期望的形式;
.从效果而言,聚合框架相当于SQL查询中的:
*GROUP BY
*LEFT OUTER JOIN
*AS等
管道(Pipline)和步骤(Stage)
.整个聚合运算过程称为管道(Pipline),它是由多个步骤(stage)组成的,每个管道:
.接受一系列文档(原始数据);
.每个步骤对这些文档进行一系列计算;
.结果文档输出给下一个步骤;
聚合运算的基本格式
pipline=[$stage1,$stage2,$stage3,.......,$stageN];
db.<COLLECTION>.aggregate(
pipline,
{ options } //目前没有涉及到
);
常见步骤中的运算符
|
$match |
$project |
$group |
|
$eq/$gt/$gte/$lt/$lte $and/$or/$not/$in $geoWithin/$intersect |
选择需要的或排除不需要的字段 $map/$reduce/filter $range $multiply/$divide/$substract/$add $year/$month/$dayOfMonth/$hour/$minute/$second |
$sum/$avg $push/$addToSet $first/$last/$max/$min
|
常见步骤
|
步骤 |
作用 |
SQL等价运算符 |
|
$match |
过滤 |
WHERE |
|
$project |
投影 |
AS |
|
$sort |
排序 |
ORDER BY |
|
$group |
分组 |
GROUP BY |
|
$skip/$limit |
结果限制 |
SKIP/LIMIT |
|
$lookup |
左外连接 |
N/A |
|
$unwind |
展开数组 |
N/A |
|
$graphLookup |
图搜索 |
N/A |
|
$facet/$bucket |
分面搜索 |
N/A |
MQL常用步骤与SQL对比