MongoDB笔记0x04

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小于2025大于10

查询内嵌文档:如果直接进行查询的话需要内嵌文档完全一致(即和数组查询一样是精确匹配),而且不能针对内嵌文档进行范围等条件查询。使用$elemMatch来满足进行内嵌文档的查询。例如:


{
  "comments":{
    "$elemMatch": {
      "author": "Joe",
      "score": {"$gte": 5}
    }
  }
}

可以查到评论中Joe 大于等于5分的评论。

Author: SinLapis
Link: http://sinlapis.github.io/2017/10/27/MongoDB笔记0x04/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.