查询数组 本页提供使用mongo shell中的db.collection.find()方法对数组字段进行查询操作的示例。 此页面上的示例使用inventory收集。 要填充inventory收集,请运行以下命令:

db.inventory.insertMany([
    { item: "journal", qty: 25, tags: ["blank", "red"], dim_cm: [ 14, 21 ] }, 
    { item: "notebook", qty: 50, tags: ["red", "blank"], dim_cm: [ 14, 21 ] },
    { item: "paper", qty: 100, tags: ["red", "blank", "plain"], dim_cm: [ 14, 21 ] },
    { item: "planner", qty: 75, tags: ["blank", "red"], dim_cm: [ 22.85, 30 ] },  
    { item: "postcard", qty: 45, tags: ["blue"], dim_cm: [ 10, 15.25 ] }
]);

匹配数组

要在数组上指定相等条件,请使用查询文档{<field>:<value>},其中<value>是要匹配的精确数组,包括元素的顺序。

下面的示例查询所有文档,其中字段标签值是按指定顺序恰好具有两个元素"red""blank"的数组:

db.inventory.find( { tags: ["red", "blank"] } )

相反,如果您希望找到一个同时包含元素“ red”“ blank”的数组,而不考虑顺序或该数组中的其他元素,请使用$all运算符:

db.inventory.find( { tags: { $all: ["red", "blank"] } } )

查询数组中的元素

要查询数组字段是否包含至少一个具有指定值的元素,请使用过滤器{<field>:<value>},其中<value>是元素值。

以下示例查询所有文档,其中tag是一个包含字符串“ red”作为其元素之一的数组:

db.inventory.find( { tags: "red" } )

要在数组字段中的元素上指定条件,请在query filter document中使用query operators

{ <array field>: { <operator1>: <value1>, ... } }

例如,以下操作查询数组dim_cm包含至少一个值大于25的元素的所有文档。

db.inventory.find( { dim_cm: { $gt: 25 } } )

为数组元素指定多个条件

在数组元素上指定复合条件时,可以指定查询,以使单个数组元素满足这些条件,或者数组元素的任何组合均满足条件。

使用数组元素上的复合过滤条件查询数组

以下示例查询文档,其中dim_cm数组包含某种组合满足查询条件的元素; 例如,一个元素可以满足大于15的条件,而另一个元素可以满足小于20的条件,或者单个元素可以满足以下两个条件:

db.inventory.find( { dim_cm: { $gt: 15, $lt: 20 } } )

查询满足多个条件的数组元素

使用$elemMatch运算符可在数组的元素上指定多个条件,以使至少一个数组元素满足所有指定的条件。

以下示例查询在dim_cm数组中包含至少一个同时大于($gt)22和小于 ($lt) 30的元素的文档:

db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )

通过数组索引位置查询元素

使用点表示法,可以为元素在数组的特定索引或位置处指定查询条件。 该数组使用基于零的索引。

[success] Note

使用点符号查询时,字段和嵌套字段必须在引号内。

以下示例查询数组dim_cm中第二个元素大于25的所有文档:

db.inventory.find( { "dim_cm.1": { $gt: 25 } } )

通过数组长度查询数组

使用$size运算符可按元素数量查询数组。 例如,以下选择数组tags具有3个元素的文档.

db.inventory.find( { "tags": { $size: 3 } } )

附加查询教程

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

译者:杨帅

校对:杨帅

参见

原文 - Query an Array

Copyright © 上海锦木信息技术有限公司 all right reserved,powered by Gitbook文件修订时间: 2020-12-18 11:34:57

results matching ""

    No results matching ""