查询数组


进入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数组包含至少一个同时大于( elemMatchdimcmgt) 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 其他查询教程

有关其他查询示例,请参见:

  • 查询文件;
  • 查询嵌入/嵌套文档;
  • 查询嵌入式文档数组。

进入MongoDB中文手册(4.2版本)目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值