目录
进入MongoDB中文手册(4.2版本)目录
本章节提供了使用MongoDB Java同步驱动程序中的com.mongodb.client.MongoCollection.find方法对数组字段进行查询操作的示例。
提示
该驱动程序提供com.mongodb.client.model.Filters帮助器,以帮助创建过滤器文档。本章节的示例使用这些方法来创建过滤器文档。
本章节的示例使用inventory 集合。要填充inventory集合,请运行以下命令:
collection.insertMany(asList(
Document.parse("{ item: 'journal', qty: 25, tags: ['blank', 'red'], dim_cm: [ 14, 21 ] }"),
Document.parse("{ item: 'notebook', qty: 50, tags: ['red', 'blank'], dim_cm: [ 14, 21 ] }"),
Document.parse("{ item: 'paper', qty: 100, tags: ['red', 'blank', 'plain'], dim_cm: [ 14, 21 ] }"),
Document.parse("{ item: 'planner', qty: 75, tags: ['blank', 'red'], dim_cm: [ 22.85, 30 ] }"),
Document.parse("{ item: 'postcard', qty: 45, tags: ['blue'], dim_cm: [ 10, 15.25 ] }")
));
1 数组匹配
请使用查询文档eq( , )作为数组相等的查询条件,其中是要匹配的数组,匹配数组需要匹配数组元素的顺序。
下面的示例查询其中字段tags的值正好是"red"和"blank"且是指定顺序的数组的所有文档:
FindIterable<Document> findIterable = collection.find(eq("tags", asList("red", "blank")));
相反,如果您希望找到一个同时包含元素"red"和的数组 “blank”,而不考虑该数组中的顺序或其他元素,请使用$all运算符:
findIterable = collection.find(all("tags", asList("red", "blank")));
2 查询数组元素
要查询数组字段是否至少包含一个具有指定值的元素,请使用过滤器eq( , ),其中是元素值。
以下示例查询所有文档,其中tags是数组,字符串"red"是其中的一个元素:
findIterable = collection.find(eq("tags", "red"));
要在array数组字段的元素上指定条件,请在查询过滤器文档中使用查询运算符。例如:
and(gte(<array field>, <value1>), lt(<array field>, <value2>) ...)
例如,以下操作查询数组dim_cm至少包含一个值大于25的元素的所有文档 。
findIterable = collection.find(gt("dim_cm", 25));
3 对数组元素指定多个查询条件
在数组元素上指定复合条件时,可以指定单个数组元素或者数组元素的任何组合作为查询条件。
3.1 对数组元素使用复合过滤条件查询数组
下面的示例是查询包含dim_cm数组的文档,且数组中包含满足某种组合条件的元素;例如,一个元素可以满足大于15 条件,而另一个元素可以满足小于20 条件,或者一个元素可以满足以下两个条件:
findIterable = collection.find(and(gt("dim_cm", 15), lt("dim_cm", 20)));
3.2 查询满足多个条件的数组元素
使用 e l e m M a t c h 运 算 符 在 数 组 的 元 素 上 指 定 多 个 条 件 , 匹 配 的 文 档 中 至 少 一 个 数 组 元 素 满 足 所 有 指 定 的 条 件 。 以 下 示 例 查 询 文 档 , 其 中 d i m c m 数 组 包 含 至 少 一 个 同 时 大 于 ( elemMatch运算符在数组的元素上指定多个条件,匹配的文档中至少一个数组元素满足所有指定的条件。 以下示例查询文档,其中dim_cm数组包含至少一个同时大于( elemMatch运算符在数组的元素上指定多个条件,匹配的文档中至少一个数组元素满足所有指定的条件。以下示例查询文档,其中dimcm数组包含至少一个同时大于(gt) 22和小于30($lt)的元素:
findIterable = collection.find(elemMatch("dim_cm", Document.parse("{ $gt: 22, $lt: 30 }")));
3.3 查询数组元素索引位置
使用点符号(dot notation),您可以为数组的特定索引或位置处的元素指定查询条件。该数组使用基于零的索引。
注意
使用点符号查询时,字段和嵌套字段必须在引号内。
以下示例查询数组dim_cm中第二个元素25大于的所有文档:
findIterable = collection.find(gt("dim_cm.1", 25));
3.4 查询数组长度
使用$size运算符可按元素数量查询数组。例如,以下示例查询数组tags具有3个元素的文档 。
findIterable = collection.find(size("tags", 3));
4 其他查询教程
有关其他查询示例,请参见:
- 查询文件;
- 查询嵌入/嵌套文档;
- 查询嵌入式文档数组。