文档菜单
文档首页
/ / /
Scala
/

读取操作

在本页

  • 先决条件
  • 连接到MongoDB部署
  • 查询集合
  • 查询过滤器
  • 空过滤器
  • 过滤器辅助工具
  • FindObservable
  • 投影
  • 排序
  • 带投影的排序
  • 解释
  • 读取偏好
  • 读取关注点

读取操作从集合中检索文档或关于文档的信息。您可以指定一个过滤器以仅检索与过滤器条件匹配的文档。

您必须设置以下组件才能运行本指南中的代码示例

  • Atest.restaurants 集合,使用来自文档资产 GitHub 中 restaurants.json 文件的文档填充文档.

  • 以下导入语句

import org.mongodb.scala._
import org.mongodb.scala.model.Filters._
import org.mongodb.scala.model.Projections._
import org.mongodb.scala.model.Sorts._

注意

本指南使用 Observable 隐式函数,如《快速入门指南》中所述入门.

首先,连接到 MongoDB 部署,然后声明并定义 MongoDatabaseMongoCollection 实例。

以下代码连接到在 localhost27017 端口上运行的独立 MongoDB 部署。然后,它定义了 database 变量来引用 test 数据库,以及 collection 变量来引用 restaurants 集合

val mongoClient: MongoClient = MongoClient()
val database: MongoDatabase = mongoClient.getDatabase("test")
val collection: MongoCollection[Document] = database.getCollection("restaurants")

要了解更多关于连接到 MongoDB 部署的信息,请参阅连接到 MongoDB 教程。

要查询集合,您可以使用集合的 find() 方法。

您可以在没有参数的情况下调用该方法来查询集合中的所有文档

collection.find().printResults()

或者,您可以通过传递一个过滤器来查询符合过滤器条件的文档

collection.find(equal("name", "456 Cookies Shop"))
.printResults()

要查询符合某些条件的文档,将过滤器文档传递给 find() 方法。

要指定空过滤器并匹配集合中的所有文档,请使用空的 Document 对象。

collection.find(Document()).printResults()

提示

使用 find() 方法时,您也可以不传递任何过滤器对象来匹配集合中的所有文档。

collection.find().printResults()

为了方便创建过滤器文档,驱动程序提供了提供过滤器条件辅助方法的 Filters 类。有关这些方法的详细信息,请参阅 Filters 指南。

以下示例查询操作包含一个过滤器 Document 实例,该实例指定以下条件

  • stars 字段值大于或等于 2 且小于 5

  • categories字段等于"Bakery",或者如果categories是一个数组字段,包含字符串"Bakery"作为元素。

collection.find(
Document("stars" -> Document("$gte" -> 2, "$lt"-> 5, "categories" -> "Bakery")))
.printResults()

以下示例使用Filters辅助方法指定相同的过滤条件。

collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery")))
.printResults()

要查看查询过滤器操作符的列表,请参阅服务器手册中的查询和投影操作符。要查看Filters辅助方法的列表,请参阅Filters API文档

find()方法返回FindObservable类的实例。该类提供了各种方法,可以将其链接到find()方法以修改查询的输出或行为,例如sort()projection(),以及通过subscribe()方法迭代结果。

默认情况下,MongoDB中的查询返回匹配文档中的所有字段。要指定返回匹配文档中的字段,可以指定投影文档。

本查找操作示例包含一个投影Document,指定匹配的文档仅包括namestarscategories字段。

collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery")))
.projection(Document("name" -> 1, "stars" -> 1, "categories" -> 1, "_id" -> 0))
.printResults()

为了便于创建投影文档,驱动程序提供了Projections辅助类方法。要了解更多关于这些方法的信息,请参阅投影指南。

collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery")))
.projection(fields(include("name", "stars", "categories"), excludeId()))
.printResults()

在投影文档中,您也可以通过使用投影操作符来指定投影表达式。

要查看使用Projections.metaTextScore()方法的示例,请参阅文本搜索教程。

要排序文档,请将排序规范文档传递给FindObservable.sort()方法。驱动程序提供Sorts辅助类方法来简化排序规范文档的创建。要了解如何使用构建器构建排序标准,请参阅排序指南。

collection.find(and(gte("stars", 2), lt("stars", 5), equal("categories", "Bakery")))
.sort(ascending("name"))
.printResults()

FindObservable方法本身返回FindObservable对象,因此您可以将多个FindObservable方法附加到find()方法上。

collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery")))
.explain()
.printResults()

要解释查找操作,请调用FindObservable.explain()方法。

collection.find(and(gte("stars", 2), lt("stars", 5), eq("categories", "Bakery")))
.explain()
.printResults()

对于副本集或分片集群上的读取操作,您可以在以下级别配置读取偏好

  • 在以下方式中的 MongoClient

    • 通过创建一个 MongoClientSettings 实例

      val mongoClient = MongoClient(MongoClientSettings.builder()
      .applyConnectionString(ConnectionString("mongodb://host1,host2"))
      .readPreference(ReadPreference.secondary())
      .build())
    • 通过创建一个 ConnectionString 实例

      val mongoClient = MongoClient("mongodb://host1:27017,host2:27017/?readPreference=secondary")
  • 通过使用 withReadPreference() 方法在 MongoDatabase

    val database = mongoClient.getDatabase("test")
    .withReadPreference(ReadPreference.secondary())
  • 通过使用 withReadPreference() 方法在 MongoCollection

    val collection = database.getCollection("restaurants")
    .withReadPreference(ReadPreference.secondary())

MongoDatabaseMongoCollection 实例是不可变的。在现有的 MongoDatabaseMongoCollection 实例上调用 withReadPreference() 返回一个新的实例,而不会影响被调用的实例。

在以下示例中,collectionWithReadPref 实例具有 primaryPreferred 读取偏好,而 collection 的读取偏好不受影响

val collectionWithReadPref = collection.withReadPreference(ReadPreference.primaryPreferred())

对于副本集或分片集群上的读取操作,应用程序可以在以下级别配置读取关注点

  • 在以下方式中的 MongoClient

    • 通过创建一个 MongoClientSettings 实例

      val mongoClient = MongoClient(MongoClientSettings.builder()
      .applyConnectionString(ConnectionString("mongodb://host1,host2"))
      .readConcern(ReadConcern.MAJORITY)
      .build())
    • 通过创建一个 ConnectionString 实例

      val mongoClient = MongoClient("mongodb://host1:27017,host2:27017/?readConcernLevel=majority")
  • 通过使用 withReadConcern() 方法在 MongoDatabase

    val database = mongoClient.getDatabase("test")
    .withReadConcern(ReadConcern.MAJORITY)
  • 通过使用 withReadConcern() 方法在 MongoCollection

    val collection = database.getCollection("restaurants")
    .withReadConcern(ReadConcern.MAJORITY)

MongoDatabaseMongoCollection 实例是不可变的。在现有的 MongoDatabaseMongoCollection 实例上调用 withReadConcern() 返回一个新的实例,而不会影响被调用的实例。

在以下示例中,collWithReadConcern 实例具有 AVAILABLE 读取关注点,而 collection 的读取关注点不受影响

val collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE)

您可以构建 MongoClientSettingsMongoDatabaseMongoCollection 实例,以包含读取关注点、读取优先级和写入关注点的组合。

例如,以下代码在集合级别设置了所有三个参数

val collection = database.getCollection("restaurants")
.withReadPreference(ReadPreference.primary())
.withReadConcern(ReadConcern.MAJORITY)
.withWriteConcern(WriteConcern.MAJORITY)

返回

创建索引