补充

  1. mongoodb 操作 VS mongoose 操作
  2. mongodb 的备份与恢复
    # 恢复
    mongorestore -d <dbname> <backupDir>
    # 备份
    mongodump -d <dbname> -o <backupDir>
    

mongodb 原生查询

语法

  1. 根据条件、投影查询指定集合,返回游标

    db.<collection>.find([filter], [projection]);
    
  2. 查询返回的是一个游标对象,它类似于迭代器,可以在查询结果中进行迭代

  3. cursor 的成员:

    • next():游标向后移动,并返回下一个结果,如果没有结果则报错
    • hasNext():判断游标是否还能向后移动,返回 boolean
    • skip(n):跳过前面的 n 条数据,返回 cursor
    • limit(n):取当前结果的 n 条数据,返回 cursor
    • sort(sortObj):按照指定的条件排序,返回 cursor
    • count():得到符合 filter 的结果数量,返回 Number
    • size():得到最终结果的数量,返回 Number
  4. 由于某些函数会继续返回 cursor ,因此可以对其进行链式编程,返回 cursor 的函数成为了链中的一环,无论它们的调用顺序如何,始终按照下面的顺序执行:sort -> skip -> limit

查询条件

  1. 比较运算符

    名称 描述
    $eq 匹配 = 指定值的值
    $gt 匹配 > 指定值的值
    $gte 匹配 >= 指定值的值
    $in 匹配数组中指定的任何值
    $lt 匹配 < 指定值的值
    $lte 匹配 <= 指定值的值
    $ne 匹配所有 !== 指定值的值
    $nin 不匹配数组中指定的任何值
  2. 逻辑运算符

    名称 描述
    $and 将查询子句与逻辑连接,并返回与这两个子句条件匹配的所有文档
    $not 反转查询表达式的效果,并返回与查询表达式不匹配的文档
    $nor 用逻辑 NOR 连接查询子句,返回所有不能匹配这两个子句的文档
    $or 用逻辑连接查询子句,或返回与任一子句条件匹配的所有文档
  3. 案例

    // 查询所有 name="曹敏" 的用户
    db.user.find({ name: "曹敏" });
    
    // 查询所有 loginId 以 7 结尾 并且 name 包含 敏 的用户
    db.user.find({ loginId: /7$/,  name: /敏/ });
    
    // 查询所有 loginId 以 7 结尾 或者 name 包含 敏 的用户
    db.user.find({
      $or: [
        {
          loginId: /7$/,
        },
        {
          name: /敏/  
        },
      ],
    });
    
    // 查询所有年龄等于18 或 20 或 25 的用户
    db.user.find({
      age: {
        $in: [18, 20, 25]
      }
    });
    
    // 查询所有年龄不等于18 或 20 或 25 的用户
    db.user.find({
      age: {
        $nin: [18, 20, 25]
      }
    });
      
    // 查询所有年龄在 20~30 之间的用户
    db.user.find({
      age: {
        $gt: 20,
        $lt: 30
      }
    });
    
    // 查询所有第一个爱好是音乐的用户
    db.user.find({
      "loves.0": "音乐"
    });
    
    // 查询所有居住城市是重庆的用户
    db.user.find({
      "address.city": /重庆/
    });
    
    // 查询将匹配包含其值为 null 或不包含 name 字段的文档
    db.user.find({ name: null })
    
    // 查询仅匹配 包含 name 字段值为 null 的文档,name 字段的值为 BSON 类型为 Null(类型编号10)
    db.user.find({ name: { $type: 10 } })
    
    // 查询与 不包含 name 字段的文档匹配
    db.user.find({ name: { $exists: false } })
    

投影

  1. find 中的第二个参数 projection 表示投影,类似于 mysql 中的 select

  2. 它是一个对象,表达了哪些字段需要投影到查询结果中,哪些不需要

    // 查询结果中仅包含 name、age,以及会自动包含的 _id
    db.user.find(
      {},
      {
        name: 1,
        age: 1
      }
    );
    
    // 查询结果不能包含 loginPwd、age,其他的都要包含
    db.user.find(
      {},
      {
        loginPwd: 0,
        age: 0
      }
    );
    
    // 查询结果中仅包含 name、age,不能包含_id
    db.user.find(
      {},
      {
        name: 1,
        age: 1,
        _id: 0
      }
    );
    
    // 错误:除了 _id 外,其他的字段不能混合编写
    db.user.find(
      {},
      {
        name: 1,
        age: 0
      }
    );
    

mongoose 中的查询

语法

API 描述
<Model>.findById(id) 按照 id 查询单条数据
<Model>.findOne(filter, projection) 根据条件和投影查询单条数据
<Model>.find(filter, projection) 根据条件和投影查询多条数据
  1. findOnefind 如果没有给予回调或等待,则不会真正的进行查询,而是返回一个 DocumentQuery 对象,可以通过 DocumentQuery 对象进行链式调用进一步获取结果,直到传入了回调、等待、调用 exec 时,才会真正执行;

  2. 链式调用中包括:

    • count
    • limit
    • skip
    • sort

差异点

  1. count 得到的是当前结果的数量

  2. 查询 id 时,使用字符串即可

    const result = await User.findById(
      '5ed093872e3da2b654983476', 
      {
        name: 1,
        age: 1,
      }
    );
    
  3. projection 支持字符串写法

    // 等价于 { address: 0, loves: 0 }
    const result = await User.findById(
      '5ed093872e3da2b654983476', 
      "-address -loves"
    );
    
  4. sort 支持字符串写法

    const result = await User.findById(
      '5ed093872e3da2b654983476', 
      "name age"
    )
      .sort('age'); // age 升序,-age 降序
    
  5. populate 支持关联查询(不建议)

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 补充
  2. 2. mongodb 原生查询
    1. 2.1. 语法
    2. 2.2. 查询条件
    3. 2.3. 投影
  3. 3. mongoose 中的查询
    1. 3.1. 语法
    2. 3.2. 差异点