mongodb 基本数组查询

本文总结了如何在 mongoDB 中对基本数组(数组中包含基本类型的元素)进行查询。

集合数据

假设有如下文档,集合名为 inventory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
db.collection('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> 是一个数组或者操作。

1
2
3
4
5
6
7
8
9
// 仅当 tags 为 ['red', 'blank'] 时才返回值
db.collection('inventory').find({
tags: ['red', 'blank']
})

// 如果只保证元素一致,而不要求元素顺序时,可以用 $all 操作符进行查询
db.collection('inventory').find({
tags: { $all: ['red', 'blank'] }
})

匹配数组中的某个元素

如果要查询数组中至少有一个元素匹配给定值时,可以使用 { <field>: <value> } 样式的查询文档来查询。<value> 是一个值。

1
2
3
4
// 返回 tags 中包含 'red' 的文档
db.collection('inventory').find({
tags: 'red'
})

value 也可以是查询过滤文档 (query filter document):

1
2
3
db.collection('inventory').find({
dim_cm: { $gt: 25 }
});

这种情况下的查询,可以将数组直接看成一个值就可以。

对数组中的某个元素进行多条件匹配

数组中多个元素共同满足一组条件

下列查询中,当满足以下情况之一时,会有返回值:

  1. dim_cm 中一个元素满足 $lt: 15,另一个元素满足$gt: 20
  2. dim_cm 中一个元素同时满足条件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
db.collection('inventory').find({
dim_cm: { $lt: 15, $gt: 20 }
},{ item:1,dim_cm:1})

// 返回
// 1
{
"_id": ObjectId("6245ad716c0b0000c00070a3"),
"item": "journal",
"dim_cm": [
14,
21
]
}

// 2
{
"_id": ObjectId("6245ad716c0b0000c00070a4"),
"item": "notebook",
"dim_cm": [
14,
21
]
}

// 3
{
"_id": ObjectId("6245ad716c0b0000c00070a5"),
"item": "paper",
"dim_cm": [
14,
21
]
}

数组中任一个元素同时满足一组条件

1
2
3
4
db.collection('inventory').find({
// dim_cm 中每一个元素都必须同时满足下列条件时才返回
dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } }
})

匹配数组中特定序号的元素

可以通过 . 点来匹配数组下标,下标从 0 开始。

1
2
3
4
// 查询第二个元素是否满足条件
db.collection('inventory').find({
'dim_cm.1': { $gt: 25 }
});

匹配特定长度的数组

1
2
3
4
// 返回 tags 中有 3 个元素的文档
db.collection('inventory').find({
tags: { $size: 3 }
});

参考

  1. Query an Array