4 查询
4.1 find
在MongoDB中,使用find()
来进行查询操作。第一个参数是查询条件,类型为文档,其中包括希望返回结果满足的键值对的要求。如果有对个键值对,将视为“与”进行查询。
find()
的第二个参数为希望返回/不返回的键,类型为文档,键即文档的键,值为1则返回该键值对,值为0则不返回该键值对。_id
默认是返回的,如果不希望返回_id
,可以使用"_id": 0
。
4.2 查询条件
除了精确查询以外,还可以使用$lt
、$lte
、$gt
、$gte
来进行范围查询,它们分别表示<
、<=
、>
、>=
。例如:
{
"age": {
"$gt": 18,
"$lt": 30
}
}
上述查询条件表示查找键名"age"
值大于18小于30的文档。另外,$ne
表示不相等。
关于$in
、$nin
:如果希望能查找某个键对应的多个值,可以使用$in
。$in
的参数为一个数组,数组中的值可以为任何类型,MongoDB会查找所有该键的值在数组中的文档。$nin
则相反,会返回所有该键的值不在数组中的文档。
关于$or
:$or
可以进行不同键的“或”查询。和$in
类似,其参数为一个数组,不过数组中的值均为文档类型。文档中即普通的查询条件。
$not
:$not
会返回所有不符合参数中查询条件的文档。和$and
、$or
都被称为“元操作符”。
null
值:如果查询时设置值为null
,则查询不仅会返回对应键值为null
的文档,还会返回没有对应键的文档。如果不希望返回这些缺少键的文档,可以使用$exist
来判断键值对是否存在。
正则表达式:进行匹配的值可以是正则表达式,所有含有匹配正则表达式的对应键值的文档都会被返回。使用正则表达式进行查询之前最好在shell中进行正则表达式的验证来防止出现问题。
数组查询:如果有一个文档:
{
"fruit": ["apple", "banana", "peach"]
}
如果查询条件如下:
{
"fruit": "apple"
}
则之前的文档会成功匹配。即如上的查询条件意味着MongoDB会查找数组内部的值。但是如果查询条件如下:
{
"fruit": ["apple", "banana"]
}
或
{
"fruit": ["banana", "apple", "peach"]
}
都不会匹配所提供的文档。即值如果是数组的话会进行精确匹配,无论是缺项或者是乱序都不会匹配。
$all
:$all
可以接受一个数组作为查询参数,只要对应键的数组中包含该数组内所有值的文档就会作为结果返回。其中$all
的数组参数的顺序是无关紧要的。
$slice
:$slice
可以限制返回的文档数。为正值时返回前面指定数目的文档,为负值时返回后面指定数目的文档。$slice
还可以指定偏移,例如:
{
"comments": {
"$slice": [23, 10]
}
}
表示从第24个元素开始,返回10个文档,不足则全部返回。
数组和范围查询相互作用:例如文档:
[
{"x": 5},
{"x": 15},
{"x": 25},
{"x": [5, 25]}
]
如果查询条件为:
{
"x": {
"$gt": 10,
"$lt": 20
}
}
则结果会返回:
[
{"x": 15},
{"x": [5, 25]}
]
匹配{"x": [5, 25]}
的原因是5
小于20
且25
大于10
。
查询内嵌文档:如果直接进行查询的话需要内嵌文档完全一致(即和数组查询一样是精确匹配),而且不能针对内嵌文档进行范围等条件查询。使用$elemMatch
来满足进行内嵌文档的查询。例如:
{
"comments":{
"$elemMatch": {
"author": "Joe",
"score": {"$gte": 5}
}
}
}
可以查到评论中Joe 大于等于5分的评论。