数据如下
没什么好说的,大家都会
我们的需求是 数组含有 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" : "其他门诊"
}]
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)