使用正则表达式查询
在 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
的集合,其中包含name
、age
、department
等字段。如果要统计年龄大于 30 岁且在IT
部门工作的员工数量,可以使用以下查询:
css
代码解读
复制代码
db.employees.find({ age: { $gt: 30 }, department: "IT" }).count();
db.表名.count()
:该方法会直接统计整个集合中的数据行数,不考虑任何条件。例如,要获取employees
集合中的总员工数,可执行:
ini
代码解读
复制代码
db.employees.count();
查询前两条数据
db.表名.find().limit(查询条件)
:用于获取指定数量的记录。假设存在一个products
集合,包含productName
、price
等字段。要查询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
集合中,包含orderId
、customerName
、orderDate
等字段。如果要从第 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
,表示不返回这两个字段。结果将包含 name
、price
、category
和 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_1
、age_1
和 salary_-1
是我们创建的索引。
删除索引
- 假设要删除
salary
字段上的降序索引,可以执行以下命令:
css
代码解读
复制代码
db.employees.dropIndex({salary: -1});
执行成功后,再次查看索引对象,salary_-1
索引将不再存在。
好了,大致就是这些,后面我会更新python连接MongoDB的内容,我也是刚学,请各位大佬多多指教!