MongoDB数据库查询进阶

使用正则表达式查询

在 find 方法中,使用 $regex 操作符来指定正则表达式。例如:

 

css

代码解读

复制代码

db.collection.find({ field: { $regex: "pattern" } });

这里的 field 是要查询的字段,"pattern" 是正则表达式的模式字符串。

示例

  • 假设我们有一个名为 users 的集合,其中包含 name 和 email 等字段,要查找所有 name 以 "J" 开头的用户,可以使用以下查询:
 

css

代码解读

复制代码

db.users.find({ name: { $regex: "^J" } });

  • 要查找 email 中包含 "gmail" 的用户,可以这样写:
 

css

代码解读

复制代码

db.users.find({ email: { $regex: "gmail" } });

  • 如果要进行不区分大小写的查询,可以使用 $options 操作符并设置为 i。例如,查找所有 name 中包含 "smith"(不区分大小写)的用户:
 

php

代码解读

复制代码

db.users.find({ name: { $regex: "smith", $options: "i" } });

多重条件查询

“且” 条件

  • 使用逗号分隔多个条件来表示 “且” 的关系。例如:
 

php

代码解读

复制代码

db.collection.find({ field1: value1, field2: value2 });

这表示查询 collection 集合中 field1 等于 value1 并且 field2 等于 value2 的文档。例如,要查询 users 集合中年龄为 25 且姓名为 "John" 的用户,可以这样写:

 

php

代码解读

复制代码

db.users.find({ age: 25, name: "John" });

“或” 条件

  • 使用 $or 操作符来表示 “或” 的关系。语法如下:
 

ini

代码解读

复制代码

db.collection.find({ $or: [ { condition1 }, { condition2 },... ] });

例如,要查询 users 集合中年龄为 20 或者姓名为 "Alice" 的用户,可以写成:

 

css

代码解读

复制代码

db.users.find({ $or: [ { age: 20 }, { name: "Alice" } ] });

也可以组合 “且” 与 “或” 条件,比如查询年龄大于 20 且(姓名为 "Bob" 或者姓名为 "Charlie")的用户:

 

css

代码解读

复制代码

db.users.find({ age: { $gt: 20 }, $or: [ { name: "Bob" }, { name: "Charlie" } ] });

操作查询结果

查看表里面有多少行数据

  • db.表名.find({条件}).count() :此方法用于在满足特定条件的情况下统计符合条件的数据行数。例如,假设有一个名为 employees 的集合,其中包含 nameagedepartment 等字段。如果要统计年龄大于 30 岁且在 IT 部门工作的员工数量,可以使用以下查询:
 

css

代码解读

复制代码

db.employees.find({ age: { $gt: 30 }, department: "IT" }).count();

  • db.表名.count() :该方法会直接统计整个集合中的数据行数,不考虑任何条件。例如,要获取 employees 集合中的总员工数,可执行:
 

ini

代码解读

复制代码

db.employees.count();

查询前两条数据

  • db.表名.find().limit(查询条件) :用于获取指定数量的记录。假设存在一个 products 集合,包含 productNameprice 等字段。要查询 products 集合中的前两条数据,可以这样写:
 

scss

代码解读

复制代码

db.products.find().limit(2);

这将返回 products 集合中的前两条记录,结果可能如下:

 

css

代码解读

复制代码

{ "_id": ObjectId("60a1b2c3d4e5f67890123456"), "productName": "Product A", "price": 10.99 } { "_id": ObjectId("60a1b2c3d4e5f67890123457"), "productName": "Product B", "price": 15.99 }

跳过行数

  • db.表名.find().skip(行数).limit(查询的条数) :这种方式可以实现分页查询效果。例如,在一个 orders 集合中,包含 orderIdcustomerNameorderDate 等字段。如果要从第 6 行开始查询 5 条数据,可以使用以下查询:
 

scss

代码解读

复制代码

db.orders.find().skip(5).limit(5);

这两种方法结合起来一般用在网页上,数据显示的时候,比如说:一个网页一般都不会显示所有内容,一般会分很多页,通过这种方法实现分页显示。

映射

只返回特定字段

  • 例如,只想获取产品的名称和价格信息,可以使用如下查询:
 

php

代码解读

复制代码

db.products.find({}, {name: 1, price: 1, _id: 0})

这里的第一个 {} 表示不设置查询条件,即返回所有文档。第二个参数 {name: 1, price: 1, _id: 0} 是映射部分,通过将 name 和 price 设置为 1 来指定要返回这两个字段,将 _id 设置为 0 表示不返回默认的 _id 字段。执行该查询后,结果将只包含每个产品的名称和价格信息,例如:

 

json

代码解读

复制代码

{ "name": "Product A", "price": 19.99 } { "name": "Product B", "price": 29.99 }

排除特定字段

  • 若要返回除了 description 字段之外的所有其他字段,可以这样写:
 

php

代码解读

复制代码

db.products.find({}, {description: 0, _id: 0})

在这个查询中,description 和 _id 被设置为 0,表示不返回这两个字段。结果将包含 namepricecategory 和 inStock 等字段,例如:

 

json

代码解读

复制代码

{ "name": "Product A", "price": 19.99, "category": "Electronics", "inStock": true } { "name": "Product B", "price": 29.99, "category": "Clothing", "inStock": false }

结合查询条件与映射

  • 假设要查询价格大于 20 且只返回产品名称和类别字段,可以使用以下查询:
 

php

代码解读

复制代码

db.products.find({price: {$gt: 20}}, {name: 1, category: 1, _id: 0})

这里的 {price: {$gt: 20}} 是查询条件,用于筛选出价格大于 20 的产品,而 {name: 1, category: 1, _id: 0} 则指定了只返回产品名称和类别字段。执行后,结果将只显示符合条件产品的名称和类别信息,例如:

 

json

代码解读

复制代码

{ "name": "Product B", "category": "Clothing" }

排序

假设存在一个名为 students 的集合,其中包含 name(姓名)、age(年龄)、grade(成绩)等字段。

升序排列

  • 要按照学生的年龄进行升序排列,可以使用以下查询:

 

lua

代码解读

复制代码

db.students.find().sort({age: 1})

这里的 {age: 1} 表示按照 age 字段进行升序排序。执行该查询后,结果将按照年龄从小到大的顺序显示学生信息,例如:

 

css

代码解读

复制代码

{ "_id": ObjectId("60a1b2c3d4e5f67890123456"), "name": "Alice", "age": 18, "grade": 85 } { "_id": ObjectId("60a1b2c3d4e5f67890123457"), "name": "Bob", "age": 19, "grade": 90 } { "_id": ObjectId("60a1b2c3d4e5f67890123458"), "name": "Charlie", "age": 20, "grade": 88 }

降序排列

  • 若要按照学生的成绩进行降序排列,可以使用以下查询:

 

lua

代码解读

复制代码

db.students.find().sort({grade: -1})

这里的 {grade: -1} 表示按照 grade 字段进行降序排序。执行该查询后,结果将按照成绩从高到低的顺序显示学生信息,例如:

 

css

代码解读

复制代码

{ "_id": ObjectId("60a1b2c3d4e5f67890123457"), "name": "Bob", "grade": 90 } { "_id": ObjectId("60a1b2c3d4e5f67890123458"), "name": "Charlie", "grade": 88 } { "_id": ObjectId("60a1b2c3d4e5f67890123456"), "name": "Alice", "grade": 85 }

多字段排序

  • 还可以按照多个字段进行排序。例如,先按照年龄升序排列,对于年龄相同的学生再按照成绩降序排列,可以使用以下查询:

 

lua

代码解读

复制代码

db.students.find().sort({age: 1, grade: -1})

执行该查询后,结果将首先按照年龄从小到大排序,在年龄相同的情况下,按照成绩从高到低排序,例如:

 

css

代码解读

复制代码

{ "_id": ObjectId("60a1b2c3d4e5f67890123456"), "name": "Alice", "age": 18, "grade": 85 } { "_id": ObjectId("60a1b2c3d4e5f67890123458"), "name": "Charlie", "age": 20, "grade": 88 } { "_id": ObjectId("60a1b2c3d4e5f67890123457"), "name": "Bob", "age": 20, "grade": 90 }

索引

建立索引

  • 假设我们有一个名为 employees 的集合,其中包含 name(员工姓名)、age(年龄)、department(部门)和 salary(薪资)等字段。如果经常需要根据员工姓名进行查询,那么可以在 name 字段上创建索引:
 

css

代码解读

复制代码

db.employees.createIndex({name: 1});

这里的 1 表示按照升序创建索引。如果要按照降序创建索引,可以使用 -1,例如在 salary 字段上创建降序索引:

 

css

代码解读

复制代码

db.employees.createIndex({salary: -1});

查看执行状态信息

  • 例如,要查询年龄为 30 岁的员工,并查看查询的执行状态信息,可以执行以下操作:

 

lua

代码解读

复制代码

db.employees.find({age: 30}).explain('executionStats');

这将返回详细的执行信息,包括查询使用的索引(如果有)、扫描的文档数量、执行时间等。例如,可能会得到如下结果:

 

bash

代码解读

复制代码

{ "queryPlanner": { "plannerVersion": 1, "namespace": "test.employees", "indexFilterSet": false, "parsedQuery": { "age": { "$eq": 30 } }, "winningPlan": { "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "age": 1 }, "indexName": "age_1", "isMultiKey": false, "multiKeyPaths": { "age": [] }, "isUnique": false, "isSparse": false, "isPartial": false, "indexVersion": 2, "direction": "forward", "indexBounds": { "age": [ "[30, 30]" ] } } }, "rejectedPlans": [] }, "executionStats": { "executionSuccess": true, "nReturned": 5, "nSkipped": 0, "totalKeysExamined": 5, "totalDocsExamined": 5, "executionTimeMillis": 2, "totalExecutionTimeMillis": 2, "inputStage": { "executionSuccess": true, "nReturned": 5, "nSkipped": 0, "totalKeysExamined": 5, "totalDocsExamined": 5, "executionTimeMillis": 1, "totalExecutionTimeMillis": 1, "inputStage": { "executionSuccess": true, "nReturned": 5, "nSkipped": 0, "totalKeysExamined": 5, "totalDocsExamined": 5, "executionTimeMillis": 0, "totalExecutionTimeMillis": 0, "inputStage": { "executionSuccess": true, "nReturned": 5, "nSkipped": 0, "totalKeysExamined": 5, "totalDocsExamined": 5, "executionTimeMillis": 0, "totalExecutionTimeMillis": 0 } } } }, "serverInfo": { "host": "localhost", "port": 27017, "version": "4.4.6", "gitVersion": "876ebee8c7dd0e2d992f36a848ff4dc50ee6603e" } }

从结果中可以看到,查询使用了名为 age_1 的索引,扫描了 5 个键和 5 个文档,执行时间为 2 毫秒等信息。

获取当前的索引对象

  • 要获取 employees 集合的所有索引对象,可以执行以下命令:
 

ini

代码解读

复制代码

db.employees.getIndexes();

可能会得到如下结果:

 

css

代码解读

复制代码

[ { "v": 2, "key": { "_id": 1 }, "name": "_id_", "ns": "test.employees" }, { "v": 2, "key": { "name": 1 }, "name": "name_1", "ns": "test.employees" }, { "v": 2, "key": { "age": 1 }, "name": "age_1", "ns": "test.employees" }, { "v": 2, "key": { "salary": -1 }, "name": "salary_-1", "ns": "test.employees" }]

其中,_id_ 是默认的主键索引,name_1age_1 和 salary_-1 是我们创建的索引。

删除索引

  • 假设要删除 salary 字段上的降序索引,可以执行以下命令:
 

css

代码解读

复制代码

db.employees.dropIndex({salary: -1});

执行成功后,再次查看索引对象,salary_-1 索引将不再存在。

好了,大致就是这些,后面我会更新python连接MongoDB的内容,我也是刚学,请各位大佬多多指教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值