记录一下工作中用到的 mongodb 复杂查询

aggregate

筛选

=== 等于

{
$match: { name: "bob" }
}

!== 不等于

{
$match: {
name: {
$ne: 'bob'
}
}
}

like %a% 模糊匹配

静态字符串匹配

{
$match: { name: /bo/ }
}

动态变量匹配

{
$match: { name: new BSONRegExp(`${keyword}`) }
}

and

name like %xx% and no like %xx%

{
$match: {
$and: [
{ "name": new BSONRegExp(`${keyword}`) },
{ "no": new BSONRegExp(`${keyword}`) },
],
},
}

or

name like %xx% or no like %xx%

{
$match: {
$or: [
{ "patient.name": new BSONRegExp(`${param.keyword}`) },
{ "patient.hospitalNo": new BSONRegExp(`${param.keyword}`) },
],
},
}

join 连表查询

基本连表

类似 sql 的 left out join 查询

{
$lookup: <MongoDBAggregateLookupType>{
from: "departmentManagers",
localField: "_id",
foreignField: "accountId",
as: "managedDepartments",
},
};
  • $lookup:对同一个数据库中的未分片集合执行 left out join
  • from:指定要执行联接的同一数据库中的集合名称
  • localField:当前集合中的字段名称
  • foreignField:from 集合中的外键字段名称
  • as:追加到当前集合结果集中的字段名称(类型是 {}[])

join 出来的数组取第一个

{
$lookup: <MongoDBAggregateLookupType>{
from: "patients",
localField: "patientId",
foreignField: "_id",
as: "patients",
},
},
{
$set: {
patient: { $first: "$patients" },
id: "$_id",
},
},
{ $unset: ["patients", "_id"] },
  • $set 向文档中添加新字段或覆盖已存在字段的值,$set stage 是 $addFields stage 的别名,这两个 stage 都相当于 $project stage,它显式地指定输入文档中的所有现有字段并添加新字段(即默认显示所有字段,通过 $set 再添加新字段或覆盖已有字段的值)
  • $first 取数组中索引为 0 的项
  • $patients/$_id 引用字段时需要用 $ 符号作为前缀,否则不会执行引用字段行为
  • { $set: { patient: { $first: "$patients" }, id: "$_id" } } 添加/设置 patient 字段的值为 patients 字段索引为 0 项的值;添加/设置 id 字段的值为 _id 字段的值
  • $unset 移除文档中的的字段,值类型可以是 string | string []

重命名对象数组中的字段名称

$project

默认隐藏所有字段,只有声明了的字段才会输出到结果集

{
$lookup: <MongoDBAggregateLookupType>{
from: "departments",
localField: "managedDepartments.departmentId",
foreignField: "_id",
as: "departments",
},
},
{
$project: {
departments: {
$map: {
input: "$departments",
as: "item",
in: {
id: "$$item._id",
name:"$$item.name",
},
},
},
},
}

输出:

[
{
"_id": "x",
"departments": [
{
"id": "xx",
"name: "bob"
}
]
}
]
  • $project 将带有请求字段的文档传递到管道中的下一个阶段。指定的字段可以是输入文档中的现有字段,也可以是新计算的字段(只有 $project 里面声明了的字段才会输出到结果中)
  • $map 将表达式应用于数组中的每个项,并返回包含应用结果的数组
  • $map.input 解析为数组的表达式,这里示例中是 $departments,相当于引用集合中的 departments 字段,引用必须加 $ 前缀
  • $map.as 可选的。表示输入数组中每个单独元素的变量的名称。如果没有指定名称,变量名默认为 this
  • $map.in 应用于输入数组的每个元素的表达式。表达式使用as中指定的变量名单独引用每个元素(引用变量用 $$ 双美元符号)

$set

默认显示所有字段,再将 $set 中新声明的新字段追加到文档中

{
$lookup: <MongoDBAggregateLookupType>{
from: "departments",
localField: "managedDepartments.departmentId",
foreignField: "_id",
as: "departments",
},
},
{
$set: {
id: "$_id",
departments: {
$map: {
input: "$departments",
as: "item",
in: {
id: "$$item._id",
name: "$$item.name",
},
},
},
}
}

输出:

[
{
"_id": "x",
...其余字段
"departments": [
{
"id": "xx",
"name: "bob"
}
]
}
]

mongodb 复杂查询的更多相关文章

  1. TODO:MongoDB的查询更新删除总结

    TODO:MongoDB的查询更新删除总结 常用查询,条件操作符查询,< .<=.>.>=.!= 对应 MongoDB的查询操作符是$lt.$lte.$gt.$gte.$ne ...

  2. MongoDB各种查询操作详解

    这篇文章主要介绍了MongoDB各种查询操作详解,包括比较查询.关联查询.数组查询等,需要的朋友可以参考下   一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可 ...

  3. Mongodb高级查询【二】

    上一篇文章,写了mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询. Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个.当然有很多查询跟关系型查询无法相比. ...

  4. mongoDB高级查询$type4array使用解析

    今天在使用mongoDB高级查询$type:符号 -- 4代指Array类型发现一个问题. $type符号: $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. 下面是mong ...

  5. MongoDb 命令查询所有数据库列表

    原文:http://blog.csdn.net/huxu981598436/article/details/47216493 MongoDb 命令查询所有数据库列表 CODE: > show d ...

  6. mongodb并列查询,模糊查询

    在mongodb的查询语句中可以这么写{“a”:$gt(1),"a":$lt(5)} 但这么查询出来的值会做单个条件匹配,最终结果为a大于1的集合+a小于5的集合 如果需要实现去交 ...

  7. mongodb中查询返回指定字段

    mongodb中查询返回指定字段   在写vue项目调用接口获取数据的时候,比如新闻列表页我只需要显示新闻标题和发表时间,点击每条新闻进入详情页的时候才会需要摘要.新闻内容等关于此条新闻的所有字段.  ...

  8. MongoDB 数据类型查询 — $type使用

    MongoDB 使用过程中经常需要根据字段的类型来查询数据, 而MongoDB中查询字段类型是通过$type操作符来实现. $type使用法语: db.集合名.find({$type:类型值}); / ...

  9. mongoDB 高级查询语法

    http://www.cnblogs.com/ITAres/articles/2084794.html本文参考自官方的手册:http://www.mongodb.org/display/DOCS/Ad ...

  10. 转】Nodejs对MongoDB模糊查询

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/4/ 感谢! Posted: Jul 1, 2013 Tag ...

随机推荐

  1. swagger的作用和配置使用

    纯API项目中 引入swagger可以生成可视化的API接口页面     引入包 nuget包: Swashbuckle.AspNetCore(最新稳定版) 配置 1.配置Startup类Config ...

  2. Rust 中的数据布局--非正常大小的类型

    非正常大小的类型 大多数的时候,我们期望类型在编译时能够有一个静态已知的非零大小,但这并不总是 Rust 的常态. Dynamically Sized Types (DSTs) Rust 支持动态大小 ...

  3. js中的bool值转换及"&&" 、"||"、 "!!"详解

    bool值转换 数据类型 bool值转化 undefined undefined 转化为 false Object null 转化为false,其他为 true Boolean false 转化为 f ...

  4. POP3:基于命令行的电子邮件(EMail)在线查看和批量下载工具

    使用该工具可以在不安装outlook和foxmail等邮件客户端的情况下快速下载指定邮箱的邮件,并将下载的邮件以eml格式进行保存. 附: 查看eml格式的邮件可使用 EmlReader 工具,该工具 ...

  5. python爬虫---爬取网易云音乐

    代码: import requests from lxml import etree text = requests.get("https://music.163.com/discover/ ...

  6. 【uniapp 开发】uni-app 技术点的链接记录

    优雅的H5下拉刷新.零依赖,高性能,多主题,易拓展 https://ask.dcloud.net.cn/article/12772 图像(头像)选择,截取,压缩,上传的分享 https://ask.d ...

  7. jboss学习1之EJB和JBOSS的宏观理解

    一.中间件(Middleware)         先来看一张图:         中间件,也就是图中的Middleware,他的作用是什么呢?        简单来说,中间件就是操作系统和应用程序之 ...

  8. getHibernateTemplate出现的所有find方法的总结

    文章转自:http://www.cnblogs.com/DarrenChan/p/5528194.html 一.find(String queryString); 示例:this.getHiberna ...

  9. Java学习笔记(韩顺平教育 b站有课程)

    Java重要特点 面向对象(oop) 健壮性:强类型机制,异常处理,垃圾的自动收集 跨平台性的 (一个编译好的.class可以在多个系统下运行) TEST.java -> TEST.class ...

  10. XStream使用记录

    XStream使用记录 官网 http://x-stream.github.io/index.html 下载地址 http://x-stream.github.io/download.html 参考资 ...