上篇文章介绍的是含有单个子文档的MongoDB嵌套查询。
这里再介绍下如何在含有多个子文档所组成的子文档列表的记录中,进行嵌套查询。
首先还是先建立个集合样本:
1 |
|
上边建创建的inventory
集合,每一条记录都嵌套有一个子文档列表,如第一条记录所在文档{ item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] }
中嵌套着含有{ warehouse: "A", qty: 5 }
和{ warehouse: "C", qty: 15 }
两个子文档,名为instock
的列表。
接下来看一下查询方式:
查询条件与列表中的子文档完全匹配:
如果记录中的子文档列表内有任何一个子文档与查询条件完全匹配(子文档元素顺序也需要一致),那么此记录视为符合查询条件:
1 |
|
如果部分匹配或者顺序不一致,则无法查询到结果:
1 |
|
根据子文档字段值进行匹配
用如下方式进行查询,如果子文档列表中任何一个子文档的字段满足条件,都可以匹配到。
比如,以下命令中,只要instock
列表内任意一个子文档的qty
字段小于等于20,都视为满足条件:
1 |
|
假设只想用子文档列表中的第一个子文档当作目标进行匹配呢?我们还可以通过如下方式指定目标子文档的索引值(从0开始):
1 |
|
指定索引值为0之后,只会拿子文档列表instock
内的第一个文档进行匹配。
使用多个查询条件对子文档列表进行匹配
使用$elemMatch
操作符进行查询的话,要求子文档列表里至少有一个子文档完全满足$elemMatch
内的所有条件。
例如,下边命令要求,instock
列表中至少有一个子文档同时满足qty
值为5,并且warehouse
值为A:
1 |
|
如下命令要求,instock
列表中至少有一个子文档同时满足qty
值大于10并且小于等于20:
1 |
|
倘若不使用$elemMatch
操作符,而是把多个查询条件作为组合,罗列在请求中的话,只要列表中有任何子文档(不必是同一个)匹配这些条件,即可返回。
例如,下边的命令中,只要instock
列表内有任意一个子文档满足qty
字段大于10,并且任意一个子文档qty
值小于等于20,即可视为满足条件。
1 |
|
再比如,下边命令中,只要instock
列表内有任意一个子文档满足qty
字段值等于5,并且任意一个子文档warehouse
值等于A,即视为满足条件。
1 |
|