mongo 进阶——查询 - 掘金

mongodb原生查询

// 根据条件、投影查询指定集合,返回游标 cursor
db.<collection>.find([filter], [projection]); 
复制代码

返回结果

查询返回的是一个游标对象,它类似于迭代器,可以在查询结果中进行迭代

mongo 进阶——查询 - 掘金

cursor的成员:

  • next():游标向后移动,并返回下一个结果,如果没有结果则报错

mongo 进阶——查询 - 掘金

  • hasNext():判断游标是否还能向后移动,返回boolean

mongo 进阶——查询 - 掘金

这个游标不会移动哦,只会判断游标的下一个是否可以移动

  • skip(n):去前面的n条数据,返回cursor

mongo 进阶——查询 - 掘金

  • limit(n):取当前结果的n条数据,返回cursor

mongo 进阶——查询 - 掘金

  • sort(sortObj):按照指定的条件排序,返回cursor

mongo 进阶——查询 - 掘金

排序中,1是正序, -1是倒序

  • count():得到符合filter的结果数量,返回Number

mongo 进阶——查询 - 掘金

  • size():得到最终结果的数量,返回Number

mongo 进阶——查询 - 掘金

由于某些函数会继续返回cursor,因此可以对其进行链式编程,返回cursor的函数成为了链中的一环,无论它们的调用顺序如何,结果都是一样的:

mongo 进阶——查询 - 掘金

执行的结果如下:

sort -> skip -> limit
复制代码

查询条件

find函数的第一个参数是查询条件filter,它的写法极其丰富,下面列举了大部分情况下我们可能使用到的写法。

// 查询所有 name="twinkle" 的用户
{
  name: "twinkle" 
}

// 查询所有 stuNo 以 1 结尾 并且 name 包含 tw 的用户
{
  stuNo: /1$/ , 
  name: /tw/  
}

// 查询所有 stuNo 以 1 结尾 或者 name 包含 mar 的用户
{
  $or: [
    {
      stuNo: /1$/,
    },
    {
      name: /mar/  
    },
  ],
}
  
// 查询所有年龄等于18 或 20 的用户
{
  age: {
    $in: [18, 20]
  }
}
  
// 查询所有年龄不等于18 或 20 或 25 的用户
{
  age: {
    $nin: [18, 20]
  }
}
  
// 查询所有年龄在 20~30 之间的用户
{
  age: {
    $gt: 20,
    $lt: 30
  }
}
复制代码

mongo 进阶——查询 - 掘金 查询中出现了一些特殊的属性,它以$开头,表达了特殊的查询含义,这些属性称之为操作符 operator

查询中的常用操作符包括:

  • $or:或者
  • $and:并且
  • $in:在…之中
  • $nin:不在…之中
  • $gt:大于
  • $gte:大于等于
  • $lt:小于
  • $lte:小于等于
  • $ne:不等于

投影

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

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

// 查询结果中仅包含 name、age,以及会自动包含的 _id
{
  name: 1,
  age: 1
}

// 查询结果不能包含 loginPwd、age,其他的都要包含
{
  stuNo: 0,
  age: 0
}

// 查询结果中仅包含 name、age,不能包含_id
{
  name: 1,
  age: 1,
  _id: 0
}

// 错误:除了 _id 外,其他的字段不能混合编写
{
  name: 1,
  age: 0
}
// 这句话的意思是说,除了name字段要显示,其他的字段都不要显示,并且除了age字段不显示,其他字段都要显示,这句话是有矛盾的
复制代码

mongo 进阶——查询 - 掘金

mongoose中的查询

<Model>.findById(id); // 按照id查询单条数据
<Model>.findOne(filter, projection); // 根据条件和投影查询单条数据
<Model>.find(filter, projection); // 根据条件和投影查询多条数据
复制代码

findOnefind如果没有给予回调或等待,则不会真正的进行查询,而是返回一个DocumentQuery对象,可以通过DocumentQuery对象进行链式调用进一步获取结果,直到传入了回调、等待、调用exec时,才会真正执行。

链式调用中包括:

  • count
  • limit
  • skip
  • sort

和mongo的使用方式一样

小彩蛋菜单

上一篇:GetFriendsLevelInSteam Tool


下一篇:6 python操作mysql