前言
上一节我们分享了使用 mongodb 完成一些基础的增删改查操作,这节将分享一些 mongo 的进阶操作。
符合查询
- 查询记录数
语法:db.getCollection(“user”).find({条件}).count();
// 查询年龄为 18 的用户数量
db.getCollection("user").find({"age":18}).count();
- 限制返回的数据条数
db.getCollection("user").find({}).limit(2);
3. 排序 (值为-1表示倒序,为1表示正序)
语法:db.getCollection(“集合名”).find().sort({“字段”:-1或者1});
db.getCollection("user").find().sort({"age":-1});
4. 数据去重
语法:db.getCollection(“集合名”).distinct(“字段名”,{限制条件(可省略)});
db.getCollection("user").distinct("age",{"age":{"$lt":90}});
5. 多条件查询
5.1 AND 操作
AND 操作分为隐式AND操作(implicit AND operation)以及显示AND操作(explicit AND operation)
隐式AND操作,如我们之前的多条件查询,各个条件之间就是 AND 关系
// 查询年龄大于等于30且小于100的用户
db.getCollection("user").find({"age":{"$gte":30,"$lt":100}});
显示AND操作,语法:db.getCollection(“集合名”).find({“$and”:[条件…]});
db.getCollection("user").find(
{
"$and":
[
{"age":{"$gte":30,"$lt":100}},
{"name":"钱七"}
]
}
);
这里看到我们看到查询的条件越来越复杂,这里建议把我们的条件格式化以便于阅读。
5.2 OR 操作
语法:db.集合.fin(“$or”:[{条件}])
当前集合数据如下

// 查询年龄小于30或者姓名为赵七的用户
db.user.find(
{"$or":
[
{"age":{"$lt":30}},
{"name":"钱七"}
]
}
);
显式AND操作和隐式AND操作可以混合使用 所有隐式AND操作都可以改写为显式AND操作。但有一些显式AND操作不能改写为隐式AND操作,例如两个 OR 条件之间是 AND 关系,看例子:
// 先插入一条数据
db.user.insertOne({"name":"韩梅梅","age":36,"sex":1,"sallary":9999});查询 (年龄大于等于20或者薪水小于10000) 并且 (性别是 0 或者姓名为 韩梅梅) 的用户信息
db.user.find({
"$and":[
{
"$or":
[
{"age":{"$gte":20}},
{"sallrary":{"$lt":10000}}
]
},
{
"$or":
[
{"sex":0},{"name":"李四"}
]
}
]
});这条语句的逻辑相对就复杂了一些,描述信息的关键地方我都标红了,并且最外层的 and 关系的两个条件我也加了括号,便于理解各条件之间的关系。大家可以根据结果再理理他们之间的关系:

嵌入式文档
所谓嵌入式文档,就是说插入数据的键值对的值本身又是一个json,看如下数据:
db.user.insertMany(
[
{"name":"张三丰","age":110,"sallary":100000,"friend":{"name":"张翠山","age":45}},
{"name":"张无忌","age":30,"sallary":30000,"friend":{"name":"赵敏","age":18,"sex":1}}
]
);在这个数据集中,“friend”称为嵌入式文档(Embedded Document),“friend”下面的字段称为嵌套字段(Nested Field),如要查询嵌套字段,则需要使用点号来指定具体的字段名,格式如 嵌入式文档名.嵌套字段名,看如下例子:
db.getCollection("user").find(
{"friend.sex":1},
{"":1,"friend.age":1}
);
// 查询集合字段包含、不包含 某些元的数据
// 查询 intersts 包含 play 的记录
db.user.find({"intersts":"play"});
// 查询 intersts 不包含 play 的记录
db.user.find({"intersts":{"$ne":"play"}});
// 查询 price 大于 170 小于等于 200 的记录
db.user.find({"price":{"$gt":170,"$lte":200}});
// 查询 intersts 数量 为 2 的记录
db.user.find({"intersts":{"$size":2}});“KaTeX parse error: Expected '}', got 'EOF' at end of input: …ateMany({条件},{"set":{更新的字段信息}});
db.user.updateMany({"name":"韩梅梅"},{"$set":{"price":[100,180]}});
db.user.updateMany({"name":"李雷"},{"$set":{"price":[200,250]}});mongodb 还支持根据记录里数组的索引查询数据:
// 查询 intersts 里第一个元素是 play 的记录
db.user.find({"intersts.0":"play"});
// 查询 price 里第一个元素等于 100 的记录
db.user.find({"price.0":{"$lte":100}});本节的内容就介绍到这里,下节我们来学习 mongodb 强大的聚合查询功能,我们下节见。
由于本人也是处于学习阶段,所有内容是看过资料以后自己实验得出,如有不妥之处还望各位批评指正,在下感激不尽。
















