前言

上一节我们分享了使用 mongodb 完成一些基础的增删改查操作,这节将分享一些 mongo 的进阶操作。

符合查询

  1. 查询记录数
    语法:db.getCollection(“user”).find({条件}).count();
// 查询年龄为 18 的用户数量
db.getCollection("user").find({"age":18}).count();

mongoDb倒叙 mongodb倒序排列_数据库

  1. 限制返回的数据条数
db.getCollection("user").find({}).limit(2);

mongoDb倒叙 mongodb倒序排列_mongodb_02


3. 排序 (值为-1表示倒序,为1表示正序)

语法:db.getCollection(“集合名”).find().sort({“字段”:-1或者1});

db.getCollection("user").find().sort({"age":-1});

mongoDb倒叙 mongodb倒序排列_nosql_03


4. 数据去重

语法:db.getCollection(“集合名”).distinct(“字段名”,{限制条件(可省略)});

db.getCollection("user").distinct("age",{"age":{"$lt":90}});

mongoDb倒叙 mongodb倒序排列_nosql_04


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}});

mongoDb倒叙 mongodb倒序排列_字段_05

显示AND操作,语法:db.getCollection(“集合名”).find({“$and”:[条件…]});

db.getCollection("user").find(
    {
        "$and":
            [
                {"age":{"$gte":30,"$lt":100}},
                {"name":"钱七"}
            ]
    }
);

mongoDb倒叙 mongodb倒序排列_数据库_06


这里看到我们看到查询的条件越来越复杂,这里建议把我们的条件格式化以便于阅读。

5.2 OR 操作

语法:db.集合.fin(“$or”:[{条件}])

当前集合数据如下

mongoDb倒叙 mongodb倒序排列_nosql_07

// 查询年龄小于30或者姓名为赵七的用户
db.user.find(
    {"$or":
        [
            {"age":{"$lt":30}},
            {"name":"钱七"}
        ]
    }
);

mongoDb倒叙 mongodb倒序排列_字段_08


显式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 关系的两个条件我也加了括号,便于理解各条件之间的关系。大家可以根据结果再理理他们之间的关系:

mongoDb倒叙 mongodb倒序排列_nosql_09

嵌入式文档

所谓嵌入式文档,就是说插入数据的键值对的值本身又是一个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}
);

mongoDb倒叙 mongodb倒序排列_mongodb_10

// 查询集合字段包含、不包含 某些元的数据

// 查询 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 强大的聚合查询功能,我们下节见。

由于本人也是处于学习阶段,所有内容是看过资料以后自己实验得出,如有不妥之处还望各位批评指正,在下感激不尽。