您必须了解的 11 个 MongoDB 查询和操作

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. 删除文档或字段

deleteOnedeleteMany 关键字用于从集合中删除文档。 使用 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)则使用驼峰命名法。请务必研究最适合你所选技术的方法。