3-MongoDB 读取文档

2020-09-08  本文已影响0人  前端程序猿

一、db.collection.find() 读取文档

Selects documents in a collection or view and returns a cursor to the selected documents.

选择集合或视图中的文档,并返回所选文档的游标。

db.collection.find(query, projection)
参数 类型 描述
query document (可选的)使用查询操作符指定选择筛选器。若要返回集合中的所有文档,请省略此参数或传递一个空文档({})。
projection document (可选的) 指定要在文档中返回与查询筛选器匹配的字段。要返回匹配文档中的所有字段,请省略此参数。

读取所有文档

db.department.find({});

二、匹配查询

三、比较查询操作符

语法:

{ <field>: { $<operator>: <value> } }

四、逻辑查询操作符

{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }

查询 namelisizhangsan 的文

// db.department.find({ name: { $in: ["lisi", "zhangsan"] } });
db.department.find({ $or: [{ name: "lisi" }, { name: "zhangsan" }] });

查询 name 不为 lisizhangsan 的文

// db.department.find({ name: { $nin: ["lisi", "zhangsan"] } });
db.department.find({ $nor: [{ name: "lisi" }, { name: "zhangsan" }] });

五、 字段查询操作符

六、数组查询操作符

准备数据

db.department.insert([
  {
    name: "a",
    skill: ["vue", "python", "mongodb"],
  },
  {
    name: "b",
    skill: ["vue", "nodejs", "mongodb", "ngix"],
  },
  {
    name: "c",
    skill: ["react", "nodejs", "mongodb", "docker"],
  },
  {
    name: "d",
    skill: [["django", "flask", "pycharm"]],
  },
  {
    name: "e",
    skill: [["django", "flask", "vscode", "vuex", "element-ui"]],
  },
]);

七、运算查询操作符

八、游标操作

db.collection.find()方法返回一个游标, 要访问文档,需要迭代游标。但是,如果返回的游标没有使用var关键字分配给变量,那么游标最多只显示结果中前 20 条文档

var myCursor = db.department.find({});
myCursor;

访问查询结果的第一条文档

var myCursor = db.department.find({});
myCursor[0];

遍历游标

var myCursor = db.department.find({});
while (myCursor.hasNext()) {
  printjson(myCursor.next());
}

// myCursor.forEach(printjson);

默认情况下,在 10 分钟内不活动或者已经遍历完的游标将自动关闭,覆盖此行为,可以使用cursor.noCursorTimeout()方法:

var myCursor = db.department.find().noCursorTimeout();

手动关闭游标

myCursor.close();

指定返回文档的数量

var myCursor = db.department.find({});
myCursor.limit(2);

跳过指定数量的文档

var myCursor = db.department.find({});
myCursor.skip(2);

翻页时,假设每页显示 2 条文档,则第二页的数据应该为:

var myCursor = db.department.find({});
myCursor.skip(2).limit(2);

limit方法参数为 0 时,将返回剩下的所有文档

var myCursor = db.department.find({});
myCursor.skip(2).limit(0);

获取游标中文档的总个数

var myCursor = db.department.find({});
// 不考虑是否调用了 `limit` 或 `skip` 方法, 将返回总个数
myCursor.count();

// 如果想知道调用了 `limit` 或 `skip` 方法后返回的个数
myCursor.count(true);

如:

> var myCursor = db.department.find().noCursorTimeout();
> myCursor.limit(2)
{ "_id" : "employee1", "name" : "zhangsan", "age" : 18 }
{ "_id" : ObjectId("5f4fe031b3dbdc66cacb3b8d"), "name" : "lisi", "age" : 19 }
> myCursor.count()
19
> myCursor.count(true)
2

cursor.sort(<document>)对文档进行排序
在 sort 参数中指定要排序的字段,值为 1 或-1 分别指定升序或降序排序。

假如对游标中的文档按 age 升序, name 降序

var myCursor = db.department.find({});
myCursor.sort({ age: 1, name: -1 });

查询 age 最大的文档

db.department.find({}).sort({ age: -1 }).limit(1)[0];

链式查询时,需要注意函数的优先级

skip 的优先级大于 limit 所以下面的命令,返回相同的结果

db.department.find({}).skip(5).limit(5);
db.department.find({}).limit(5).skip(5);

sort 的优先级 大于 skip

db.department.find({}).skip(5).limit(5).sort({ age: -1 });
// db.department.find({}).sort({ age: -1 }).skip(5).limit(5);

九、文档的投射

投影参数决定在匹配的文档中返回哪些字段
投影参数采用以下形式的文档

{ <field1>: <value>, <field2>: <value> ... }

返回的文档中,只包含字段 name_id

db.department.find({}, { name: 1 });

返回的文档中,只包含字段 name

db.department.find({}, { name: 1, _id: 0 });

返回的文档中,不包含字段 name

db.department.find({}, { name: 0 });

除了文档主键 _id 外,不能再投射中使用,即包含与不包含的操作

try {
  db.department.find({}, { name: 0, age: 1 });
} catch (e) {
  print(e);
}

运行结果:

Error: error: {
    "ok" : 0,
    "errmsg" : "Cannot do inclusion on field age in exclusion projection",
    "code" : 31253,
    "codeName" : "Location31253"
}

十、 投影操作符

十一、 总结

上一篇下一篇

猜你喜欢

热点阅读