MongoDB 是一款备受专业开发人员青睐的 NoSQL 数据库。它以其出色的灵活性、良好的扩展能力以及处理海量数据的强大性能,成为了现代应用程序开发的首选。 如果你希望深入掌握 MongoDB 的常用查询和操作,那么这篇文章将为你提供帮助。
继续阅读以深入了解更多内容。
无论是为了高效地检索和管理数据、构建强大的数据模型,还是为了开发响应迅速的应用,掌握常用的 MongoDB 查询和操作无疑会显著提升你的技能水平。
1. 创建或切换数据库
在本地环境中,通过 MongoDB Shell 创建数据库非常便捷,尤其是在你已经设置好远程集群的情况下。你可以使用 use
命令在 MongoDB 中建立一个新的数据库:
use db_name
尽管上述命令主要用于创建新数据库,但它也可以轻松地切换到已存在的数据库,而无需从头创建。
2. 删除数据库
首先,使用 use
命令切换到你需要删除的数据库。然后,利用 dropDatabase()
命令执行删除操作:
use db_name
db.dropDatabase()
3. 创建集合
要建立一个新的集合,首先要切换到目标数据库。然后,使用 createCollection()
关键字创建 MongoDB 集合:
db.createCollection("collection_name")
请将 collection_name
替换为你希望的集合名称。
4. 将文档插入集合
当需要向集合添加数据时,你可以选择插入单个文档或者文档数组。
插入单个文档的方法如下:
db.collection_name.insertOne({"Name":"Idowu", "Likes":"Chess"})
你也可以通过以下方式插入包含单个 ID 的文档数组:
db.collection_name.insertOne([{"Name":"Idowu", "Likes":"Chess"}, {"Language": "Mongo", "is_admin": true}])
要一次性插入多个文档(每个文档具有独立的ID),则可以使用 insertMany
关键字:
db.collection_name.insertMany([{"Name":"Idowu", "Likes":"Chess"}, {"Name": "Paul", "Likes": "Wordle"}])
5. 从集合中获取所有文档
你可以使用 find()
关键字来查询集合中的全部文档:
db.collection_name.find()
上述命令将返回指定集合内的所有文档:
你还可以限制返回数据的数量。例如,要获取前两个文档,可以使用以下命令:
db.collection_name.find().limit(2)
6. 过滤集合中的文档
在 MongoDB 中,有多种方法可以过滤文档。例如,假设有以下数据:
如果你只想查询文档中的特定字段,可以使用 find
方法:
db.collection_name.find({"Likes":"Wordle"}, {"_id":0, "Name":1})
上述命令会返回 Likes
值为 Wordle
的所有文档,并只显示名称,忽略文档 ID。
你也可以根据数值条件来过滤集合。比如,你想获取所有年龄大于21岁的用户的姓名,可以使用 $gt
运算符:
db.collection_name.find({"Likes":"Chess", "Age":{"$gt":21}}, {"_id":0, "Name":1})
输出结果如下所示:
尝试将 find
替换为 findOne
,看看会发生什么。此外,还有许多其他的过滤关键字:
-
$lt
:获取所有小于指定值的值。 -
$gte
:获取所有大于或等于指定值的值。 -
$lte
:获取所有小于或等于指定值的值。 -
$eq
:获取所有等于指定值的值。 -
$ne
:获取所有不等于指定值的值。 -
$in
:用于基于数组进行查询。获取所有与数组中任何项匹配的值。$nin
关键字则相反。
7. 排序查询
排序可以帮助你按照特定的顺序组织查询结果。你可以选择升序或降序排列。请记住,排序需要数值参考。
例如,要进行升序排序:
db.collection_name.find({"Likes":"Chess"}).sort({"Age":1})
要对上述查询进行降序排序,只需将 “1” 替换为 “-1”:
db.collection_name.find({"Likes":"Chess"}).sort({"Age":-1})
8. 更新文档
MongoDB 的更新操作需要使用原子运算符来指定更新的方式。以下是一些可以与更新查询结合使用的常用原子运算符:
-
$set
:添加新字段或修改已存在的字段。 -
$push
:向数组中添加新项。 与$each
运算符一起使用可以一次插入多项。 -
$pull
:从数组中删除一项。与$in
一起使用可以一次删除多项。 -
$unset
:从文档中删除字段。
例如,要更新文档并添加一个新字段,可以使用以下代码:
db.collection_name.updateOne({"Name":"Sandy"}, {"$set":{"Name":"James", "email":"[email protected]"}})
上述命令更新了指定文档,如图所示:
使用 $unset
运算符删除电子邮件字段非常简单:
db.collection_name.updateOne({"Name":"Sandy"}, {"$unset":{"email":"[email protected]"}})
考虑以下示例数据:
你可以使用 $push
运算符将项目插入到现有项目数组字段中:
db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items":"Plantain"}})
输出结果如下:
使用 $each
运算符可以一次插入多个项目:
db.collection_name.updateOne({"Name":"Pete"}, {"$push":{"items": {"$each":["Almond", "Melon"]}}})
输出结果如下:
如前所述,$pull
运算符用于从数组中删除项目:
db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items":"Plantain"}})
更新后的数据如下所示:
使用 $in
关键字可以一次性删除数组中的多个项目:
db.collection_name.updateOne({"Name":"Pete"}, {"$pull":{"items": {"$in":["Almond", "Melon"]} }})
9. 删除文档或字段
deleteOne
或 deleteMany
关键字用于从集合中删除文档。 使用 deleteOne
可以根据指定字段删除单个文档:
db.collection_name.deleteOne({"Name":"IDNoble"})
如果需要删除多个具有相同键的文档,请使用 deleteMany
。下面的查询会删除所有 Likes
字段为 Chess
的文档。
db.collection.deleteMany({"Likes":"Chess"})
10. 索引操作
索引通过减少 MongoDB 需要扫描的文档数量来提高查询性能。通常,最好在你经常查询的字段上创建索引。
MongoDB 的索引类似于用于优化 SQL 查询的索引。例如,要在 “Name” 字段上创建升序索引:
db.collection.createIndex({"Name":1})
列出你的索引:
db.collection.getIndexes()
以上仅仅是入门。在 MongoDB 中创建索引的方法还有很多种。
11. 聚合
聚合管道是 MapReduce 的改进版本,允许你在 MongoDB 内部运行和存储复杂的计算。与 MapReduce 不同,MapReduce 需要在独立的 JavaScript 函数中编写映射和化简函数,而聚合操作非常简单,仅需使用 MongoDB 内置方法。
例如,考虑以下销售数据:
使用 MongoDB 的聚合功能,你可以计算并存储每个类别售出产品的总数,如下所示:
db.sales.aggregate([{$group:{"_id":"$Section", "totalSold":{$sum:"$Sold"}}}, {$project:{"_id":0, "totalSold":1, "Section":"$_id"}}])
上述查询返回以下结果:
掌握 MongoDB 查询
MongoDB 提供了多种查询方法,包括提高查询性能的功能。无论你使用哪种编程语言,上述的查询结构都是与 MongoDB 数据库交互的基础。
不过,基本语法可能会存在一些差异。例如,一些编程语言(如 Python)支持蛇形命名法,而其他编程语言(包括 JavaScript)则使用驼峰命名法。请务必研究最适合你所选技术的方法。