目录
[1、查询条件运算符:expr 和 regex](#1、查询条件运算符:expr 和 regex)
[1.1、expr 运算符](#1.1、expr 运算符)
[expr 常用操作符](#expr 常用操作符)
[1.2、regex 运算符](#1.2、regex 运算符)
[常用选项(options)](#常用选项(options))
[2.1、lookup:多表关联查询](#2.1、lookup:多表关联查询)
一、MongoDB-SQL
1、查询条件运算符:expr 和 regex
1.1、$expr 运算符
$expr 允许你在查询语句中使用聚合表达式,实现字段间的比较和复杂条件查询。
注解:$expr 主要用于比较同一文档中不同字段的值,或者使用聚合表达式进行条件判断。
$expr 常用操作符
|---------|--------|--------------------------------------|
| 操作符 | 描述 | 示例 |
| eq | 等于 | eq: ["field1", "field2"] |
| ne | 不等于 | ne: ["field1", "value"\] |
| gt | 大于 | gt: \["field1", 100] |
| lt | 小于 | lt: ["field1", "field2"] |
| and | 逻辑与 | and: [expr1, expr2] |
| or | 逻辑或 | or: [expr1, expr2] |
| concat | 字符串连接 | concat: ["fname", " ", "lname"] |
| substr | 字符串截取 | substr: ["$name", 0, 3] |
**注:**使用 expr 时,字段名前需要加 符号,表示引用字段值而非字面量。
bash
-- 查询xx_tbl记录中field1字段与field2字段值相等
db.xx_tbl.find({
$expr: { $eq: ["$field1", "$field2"] }
})
1.2、$regex 运算符
$regex 提供正则表达式功能,用于模式匹配字符串查询。
**注解:**正则表达式是强大的文本匹配工具,$regex 让你能在 MongoDB 中利用这一功能。
bash
db.collection.find({
field: { $regex: /pattern/, $options: 'options' }
})
// 或者
db.collection.find({
field: { $regex: 'pattern', $options: 'options' }
})
常用选项($options)
| 选项 | 描述 |
|---|---|
i |
不区分大小写 |
m |
多行匹配 |
x |
忽略空白字符 |
s |
允许点字符(.)匹配所有字符 |
2、聚合框架
聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息。
|----------|-----------------------|
| 命令 | 功能描述 |
| project | 指定输出文档里的字段. |
| match | 选择要处理的文档,与fine()类似。 |
| limit | 限制传递给下一步的文档数量。 |
| skip | 跳过一定数量的文档。 |
| unwind | 扩展数组,为每个数组入口生成一个输出文档。 |
| group | 根据key来分组文档。 |
| sort | 排序文档。 |
| geoNear | 选择某个地理位置附近的的文档。 |
| out | 把管道的结果写入某个集合。 |
| redact | 控制特定数据的访问。 |
| $lookup | 多表关联(3.2版本新增) |
2.1、$lookup:多表关联查询
命令语法
bash
{
$lookup:
{
from: <collection to join>,
localField: <field from the input documents>,
foreignField: <field from the documents of the "from" collection>,
as: <output array field>
}
}
语法说明:
|--------------|--------------------------------------------------------------------------------------------|
| 语法值 | 解释说明 |
| from | 同一个数据库下等待被Join的集合。 |
| localField | 源集合中的match值,如果输入的集合中,某文档没有 localField 这个Key(Field),在处理的过程中,会默认为此文档含 有 localField:null的键值对。 |
| foreignField | 待Join的集合的match值,如果待Join的集合中,文档没有foreignField 值,在处理的过程中,会默认为此文档含有 foreignField:null的键值对。 |
| as | 为输出文档的新增值命名。如果输入的集合中已存在该值,则会覆盖掉, |
此语法类似SQL
sql
SELECT *, <output array field>
FROM collection
WHERE <output array field> IN (SELECT *
FROM <collection to join>
WHERE <foreignField>= <collection.localField>);
例:
bash
-- xx1_tbl 与 xx2_tbl进行关联
SELECT *, <output array field1>
FROM xx1_tbl
WHERE <output array field1> IN (SELECT *
FROM xx2_tbl
WHERE <filed3 = false);
db.xx1_tbl.aggregate([
{
$lookup:
{
from: "xx2_tbl",
localField: "filed1",
foreignField: "filed2",
as: "xx2_tbl_docs"
}
},
{ $match : {"xx2_tbl_docs.filed3" :false} }
])
每天⽤⼼记录⼀点点。内容也许不重要,但习惯很重要!
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!