MongoDB 查询技巧(3) - 数组 *** 作

MongoDB 查询技巧(3) - 数组 *** 作,第1张

最近用到了 MongoDB 数组的一些 *** 作符,如 $all $elemMatch 所以研究一下,分享在这里

数据如下

没什么好说的,大家都会

我们的需求是 数组含有 15、16。。。30、31 ,太多了,用表达式 $gt :14, $lt: 33

我们很快写出来了

范围调整一下,试试查不到的情况,那就 11 <x <15 吧,看下 数组含有 12、13、14 ,应该是查不到的

什么情况?应该是匹配不到的呀

查阅官方文档, Query an Array

在 find 里对数组字段写多个条件,这些条件之间是 in 的关系,大家理解为 or 也没问题

那此时该怎么办呢? $elemMatch 就排上用场了, 官方文档为 elemMatch

翻译过来就是: $elemMatch *** 作符可以用来匹配指定 数组 字段,包含有 至少一个 可以满足所有查询条件 的元素

我们试一下

OK,此时返回为空,正常了

对比一下普通字段

对于数据

可以看出:

对于数据

我知道有个文档的数组字段值就是 [ 1, 2, 3 ] ,现在把它找出来

现在写语句

又不对了~

我们都知道还有个 $all *** 作,现在来试试

查阅文档 $all 得知

所以 $all 的参数其实是一个 子集 ,作用就是找出包含这个子集的数组字段的文档

那么这里改怎么实现呢?在网上看到了一些回答,思路都是 数组字段不包含 1 2 3之外的元素 , 也就是 双重否定

来试一下

发现一些空的,还有其它类型的也都冒出来了,那么就再过滤一下

对于数据

按照普通思路,上查询语句

发现不对,还是按照 上面的 双重否定 思路来实现

还是有一些干扰项,排除之

总结下来:

allMatch 思路就是 双重否定 加 排除干扰项

https://stackoverflow.com/questions/23595023/check-if-every-element-in-array-matches-condition

https://stackoverflow.com/questions/19574849/check-if-all-elements-in-mongodb-array-match-a-given-query

https://dba.stackexchange.com/questions/203042/mongodb-operator-to-match-arrays-whose-elements-are-all-contained-in-a-specifie

http://www.askasya.com/post/matchallarrayelements/

上篇 MongoDB 实用数组聚合 *** 作 (1) 介绍了数组的匹配筛选、字段筛选、分组、求和、最大最小值内容。本篇接续上篇,继续介绍实用的数组聚合 *** 作,使用的测试数据还是上一篇的数据。

数组展开是针对某个字段数据类型为数组的,可以针对数组每个元素都展开成一个单独的文档数据,从而可以进行其他 *** 作。

结果为:

可以在聚合 *** 作中指定按某个字段排序,其中 1 对应升序, -1 对应降序。

使用 $sort *** 作符可以指定跳过前面的元素个数。例如,对上面的例子过滤掉前面3个文档,得到的只剩下第4个元素 Amy 。

使用$limit *** 作符可以限制返回文档的数量。

也可以和 $skip 组合 *** 作,但是需要注意, $skip 和 $limit 次序不同结果不同。 $skip 在前,会先跳过前面的两个文档,然后再限制,而 $limit 在前会先返回限制数量的文档后再跳过前面的文档。利用这样的组合实际上就可以实现类似 SQL 的分页效果。

本篇介绍了 MongoDB 的数组聚合 *** 作中的数组元素展开 $unwind ,数组排序 $sort ,跳过 $skip 和限制返回数量 $limit 等 *** 作,同时组合 $skip 和 $limit 可以实现分页,下一篇介绍如何在聚合函数中实用条件比较 *** 作符。

mongodb中使用aggregate可以返回数组字段数组的指定索引的元素

参考语句:

{$match:{'duid':15}},

{$project:{duid:1,"default":1}},

{$unwind:"$default.styles"},

{$match:{'default.styles.status':1}},

{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}

解释:

1:过滤数据{$match:{'duid':15}}

2:获取想要的列{$project:{duid:1,"default":1}}

3:获取展开后数组字段{$unwind:"$default.styles"}

4:条件查询数组元素{$match:{'default.styles.status':1}}

5:分组后保存结果{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}

数据结构如下:

{

"_id" : ObjectId("55dad346ea23e7c11beefce5"),

"duid" : 11.0,

"default" : {

"style" : "普通会诊",

"alias" : "",

"money" : "0",

"styles" : [{

"code" : 1,

"style" : "普通会诊",

"alias" : "一般会诊",

"money" : 100,

"status" : 1,

"remark" : "需要患者亲自来到医院"

} {

"code" : 6,

"style" : "夜间门诊",

"alias" : "夜间门诊",

"money" : 100,

"status" : 0,

"remark" : "夜间门诊"

}, {

"code" : 7,

"style" : "其他门诊",

"alias" : "其他门诊",

"money" : 10,

"status" : 0,

"remark" : "其他门诊"

}]

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10702297.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存