一、查询语法
本篇我们主要讲解在集合或视图中查询文档,首先说明一下查询的语法:
db.collection.find(query, projection, options)
此定义可以从集合或者视图中查找文档并返回一个游标(cursor);
参数
query: 此选项可选,用于指定查询过滤器,如果要查询集合中的所有文档,可省略此参数或者传递空文档{}
projection: 此选项可选,用于指定在文档中返回的字段,如果要返回匹配文档中的所有字段,可省略此参数。
options:此选项可选,用于指定查询的其他选项。可以用于修改查询行为以及返回结果的方法。
返回
一个指向符合查询条件的文档的游标。当 find() 方法"返回文档",该方法实际上是返回一个指向文档的游标。
二、Query选择器
1、比较筛选
1.1 相等($eq)
语法:{ <field>: { $eq: <value> } }
该表达式等效于:
{ <field>: <value> }
例子:
查询集合test所有的文档:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
下面我们查询年龄=20的成员:
db.test.find({"age": { $eq: 20 }});
此查询等效于:
db.test.find({"age": 20});
这两个查询的结果一致,如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
1.2 不相等($ne)
语法:{ <field>: { $ne: <value> } }
例子:
下面我们查询年龄!=20的成员:
db.test.find({"age": { $ne: 20 }});
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
1.3 大于($gt)
语法:{ <field>: { $gt: <value> } }
例子:
下面我们查询年龄>22的成员:
db.test.find({"age": { $gt: 22 }});
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
1.4 大于等于($gte)
语法:{ <field>: { $gte: <value> } }
例子:
下面我们查询年龄>=22的成员:
db.test.find({"age": { $gte: 22 }});
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
1.5 小于($lt)
语法:{ <field>: { $lt: <value> } }
例子:
下面我们查询年龄<22的成员:
db.test.find({"age": { $lt: 22 }});
查询的结果如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
1.6 小于等于($lte)
语法:{ <field>: { $lte: <value> } }
例子:
下面我们查询年龄<=22的成员:
db.test.find({"age": { $lte: 22 }});
查询的结果如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
1.7 与数组中的任一值匹配($in)
语法:{ <field>: { $in: [ <value1>, <value2>, ... <valueN>] } }
例子:
下面我们查询年龄等于20或者22的成员:
db.test.find({"age": { $in: [ 20, 22 ] }});
查询的结果如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
1.8 与数组中的值均不匹配($nin)
语法:{ <field>: { $nin: [ <value1>, <value2>, ... <valueN>] } }
例子:
下面我们查询年龄不等于20,22的成员:
db.test.find({"age": { $nin: [ 20, 22 ] }});
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
2、逻辑筛选
2.1 并且($and)
语法:{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
查询满足所有表达式的文档。
例子:
下面我们查询年龄大于21并且小于24的成员:
db.test.find({ $and: [ {"age": {$lt: 24}}, {"age": {$gt: 21}} ] }
);
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fd"), "id" : "1002", "name" : "李四", "age" : 22 }
2.2 或者($or)
语法:{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
查询至少满足一个表达式的文档
例子:
下面我们查询年龄小于21或者大于24的成员:
db.test.find({ $or: [ {"age": {$gt: 24}}, {"age": {$lt: 21}} ] }
);
查询的结果如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
2.3 非($not)
语法:{ <field>: { $not: { <operator-expression> } } }
查询不满足表达式的文档
例子:
下面我们查询年龄不等于22的成员:
db.test.find({ "age": { $not: { $eq: 22 }} });
查询的结果如下:
{ "_id" : ObjectId("642be48ec2efd6c6eacc71fc"), "id" : "1001", "name" : "张三", "age" : 20 }
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }
2.4 或非($nor)
语法:{ $nor: [ { <expression1> }, { <expression2> }, ... { <expressionN> } ] }
查询不满足所有表达式的文档
例子:
下面我们查询“年龄不等于22并且姓名不等于张三”的成员:
db.test.find({ $nor: [ {"age": {$eq: 22}}, {"name": "张三"} ] }
);
查询的结果如下:
{ "_id" : ObjectId("642be59ec2efd6c6eacc71fe"), "id" : "1003", "name" : "王五", "age" : 25 }