记录一下工作中用到的 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. ACM - 最短路 - AcWing 849 Dijkstra求最短路 I

    AcWing 849 Dijkstra求最短路 I 题解 以此题为例介绍一下图论中的最短路算法.先让我们考虑以下问题: 给定一个 \(n\) 个点 \(m\) 条边的有向图(无向图),图中可能存在重边 ...

  2. 如何解决Visual Studio 2017 运行后控制台窗口一闪就消失了

    出现这种情况的原因 安装使用Visual Studio 2017 后,用Ctrl+F5运行程序,结果控制台窗口一闪就没了,也没有出现"press any key to continue-&q ...

  3. 论文解读( N2N)《Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximization》

    论文信息 论文标题:Node Representation Learning in Graph via Node-to-Neighbourhood Mutual Information Maximiz ...

  4. 小程序web开发框架-weweb介绍

    weweb是一个兼容小程序语法的前端框架,你可以用小程序的写法,来写web单面应用.如果你已经有小程序了,通过它你可以将你的小程序运行在浏览器中.在小程序大行其道的今天,它可以让你的小程序代码得到最大 ...

  5. ES6实战:新数字方法

    本文翻译自:https://www.sitepoint.com/es6... 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文介绍了ES6中全新的数字方 ...

  6. 移动端的vw px rem之间换算

    一.vw px rem em是什么 1.vw:就是相对视口宽度(Viewport Width).1vw = 1% * 视口宽度.也就是说,一个视口就是100vw. 2.px:px应该是在css中使用最 ...

  7. 【Android开发】【数据库】LitePal 数据库的使用

    一,导包 dependencies { ...... // LitePal的包 compile 'org.litepal.android:core:1.3.1' ...... } 二,创建bean类 ...

  8. OllyDbg---寄存器

    寄存器 寄存器的概念和作用 寄存器是CPU内部的高速存储单元,访问速度比常规内存快很多. 处理器在执行程序时,需要一个助手,当执行一条指令时,比如将两个内存单元中存放的内容相加,处理器需要先把其中一个 ...

  9. Linux下编写和加载 .ko 文件(编写linux驱动)

    一..ko 文件介绍 .ko文件是kernel object文件(内核模块),该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载. 二.优点 (1)这样可以缩小内核体积 ...

  10. 一个程序的执行时间可以使用time+命令形式来获得

    编写程序testtime.c #include <stdio.h> //这个头一定要加 #include<time.h> main() { time_t timep; time ...