Mongodb聚合操作中的$type

在mongodb查询语句中,用户可以通过指定type值,查询出的符合字段类型的文档数据。在mongodb聚合操作中,也存在type操作符。本文就聚合操作中的$type进行介绍。

定义

返回一个表示传入参数BSON类型的字符串。在聚合操作中,按照下面的语法来返回类型信息

复制代码
{$type: <expression>}

其中,expression可以是字段名称,运算等任何合法的表达式。

行为

与查询过滤器中的type用法不同。聚合操作中的type用来返回表达式中的结果类型。如当传入一个数组作为参数是,返回数组类型。

当指定字段名称作为参数时,当文档中不存在该字段时,$type返回字符串"missing"。

下面表格描述了传入不同参数时获取到的结果。

|----------------------------|----------|
| 表达式 | 结果 |
| {type: "a"} | "string" | | {type: /a/} | "regex" |
| {type: 1} | "double" | | {type: NumberLong(627)} | "long" |
| {type: {x: 1}} | "object" | | {type: \[1, 2, 3 ]} | "array" |

其中,为了避免数组1, 2, 3被解析成参数列表,这里将数组转换成了字面意义。

应用

在集合coll中有下面6个文档。

复制代码
db.coll.insertMany([
    {_id: 0, a: 8},
    {_id: 1, a: [ 41.63, 88.19]},
    {_id: 2, a: {a: "apple", b: "banana", c: "carrot"}},
    {_id: 3, a: "caribou"},
    {_id: 4, a: NumberLong(71)},
    {_id: 5},
    ])

使用聚合查询,查询字段a的类型

复制代码
db.coll.aggregate([{
    $project: {
        a: {$type: "$a"}
    }
}])

/* 1 */
{
	"_id" : 0,
	"a" : "int"
},

/* 2 */
{
	"_id" : 1,
	"a" : "array"
},

/* 3 */
{
	"_id" : 2,
	"a" : "object"
},

/* 4 */
{
	"_id" : 3,
	"a" : "string"
},

/* 5 */
{
	"_id" : 4,
	"a" : "long"
},

/* 6 */
{
	"_id" : 5,
	"a" : "missing"
}

再来试试上面举例中返回数组的类型。直接传入数组时, mongodb返回了一个错误。 mongodb把直接传入的数组解析成了3个参数。而$type只能接受一个参数

复制代码
//直接传入一个数组
db.coll.aggregate([{
    $project: {
        a: {$type: [1,2,3]}
    }
}])
{
	"message" : "Invalid $project :: caused by :: Expression $type takes exactly 1 arguments. 3 were passed in.",
	"ok" : 0,
	"code" : 16020,
	"codeName" : "Location16020"
}

因此我们需要将数组的字面意义作为表达式传递给$type作为参数。

复制代码
db.coll.aggregate([{
    $project: {
        a: {$type: {$literal: [1,2,3]}} //使用$literal传递数组的字面意义,不要被解析
    }
}])

或者把数组整体作为一个参数,传递给$type

复制代码
db.coll.aggregate([{
    $project: {
        a: {$type: [[1,2,3]]}
    }
}])

这里, $type后面是一个数组,数组中只有一个元素是1,2,3的数组。当mongodb解析时,得到这个数组作为参数。

相关推荐
AIGS0013 分钟前
工艺参数散在Excel和纸质文件里,能不能统一管、随查随用
服务器·数据库·excel·经验沉淀·知识管理·工艺知识·本体语义
裕晟资质规划3 分钟前
军工保密资质二级申报的四个可量化硬条件:条文位置、数值口径与西安配套企业实务要点
java·服务器·网络·数据库·算法
LuminousCPP4 分钟前
数据结构-排序(一):基础排序算法横向对比|冒泡、插入、希尔、堆与双向选择,详解二分 / Knuth 增量
c语言·数据结构·笔记·算法·排序算法
Nil20813 分钟前
leetcode 46全排列
算法·leetcode·职场和发展
子非鱼a21 分钟前
【WEB】October 2019 Twice SQL Injection
数据库·sql
Elastic 中国社区官方博客24 分钟前
Elasticsearch:ES|QL 搜索教程
大数据·数据库·人工智能·sql·elasticsearch·搜索引擎·全文检索
喂自己代言27 分钟前
从 0.7 秒到 11 毫秒:OceanBase 一条慢 SQL 的三连坑优化实战
数据库·sql·oceanbase
辰烨chenye29 分钟前
LeetCode Hot 100 题解 · 动态规划篇
算法·leetcode·动态规划
哈__42 分钟前
KES-Operator正式发布:基于Kubernetes的数据库集群云原生全生命周期管理方案
数据库·云原生·kubernetes
鸽芷咕43 分钟前
金仓KES向量数据库实战:一条SQL干掉ETL,机器人不再把停产货当现货卖
数据库·sql·etl