记录一下工作中用到的 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. python udp socket通信

    前段时间学习了一下c++的socket通信,但发现那玩意儿比较复杂还是转向python了,下面就是一个简单的udpsocket通信程序,欢迎大佬前来指正 udp聊天 import socket # 创 ...

  2. Citus 分布式 PostgreSQL 集群 - SQL Reference(手动查询传播)

    手动查询传播 当用户发出查询时,Citus coordinator 将其划分为更小的查询片段,其中每个查询片段可以在工作分片上独立运行.这允许 Citus 将每个查询分布在集群中. 但是,将查询划分为 ...

  3. (stm32f103学习总结)—输入捕获模式

    一.输入捕获介绍 在定时器中断实验章节中我们介绍了通用定时器具有多种功能,输入捕获就是其中一种.STM32F1 除了基本定时器 TIM6 和 TIM7,其他定时器都具有输入捕获功能.输入捕获可以对输入 ...

  4. 前端基础问题整理-HTML相关

    DOCTYPE的作用以及常见的DOCTYPE类型 <!DOCTYPE>声明位于文档中的最前面的位置,处于 <html> 标签之前,用来告知浏览器页面目前的文件是用哪种版本的HT ...

  5. Vuet.js规则详解,它是你不知道的强大功能?

    Vuet.js是什么? Vuet.js是给Vue.js提供状态管理的一个工具,与vuex不同,它是一种崇尚规则定制的状态管理模式.事先将状态更新的规则写好,然后将规则注入到组件中,然后状态按照预订的规 ...

  6. 通读Python官方文档之wsgiref(未完成)

    wsgirf-WSGI功能及参考实现 源码:Lib/wsgiref Web服务器网关接口(Web Server Gateway Interface, WSGI),是用Python写的一个服务器软件和w ...

  7. Java中jdk安装与环境变量配置

    Java中jdk安装与环境变量配置 提示:下面是jdk1.7和jdk1.8的百度网盘链接 链接:https://pan.baidu.com/s/1SuHf4KlwpiG1zrf1LLAERQ 提取码: ...

  8. 启动两个jboss需要修改的端口号 (两个不能相同)

    standalone-configuration-standalone.xml

  9. 第一阶段:Java基础之控制结构

    1.顺序结构 按照顺序控制结构运行,即语句从上到下,从左到右 2.选择结构 if..else..语句 switch..case..语句 3.循环结构 while循环 do...while & ...

  10. spring-bean依赖注入-02(通过p命名空间注入)

    上一篇博客讲述了为什么使用spring依赖注入,怎么注入,详见 spring-bean依赖注入-01(等你来点击) 废话不多说,开始使用p命名空间进行set注入 使用另外一种注入方式是这样的(具体实现 ...