读取操作
读取操作从集合中检索文档或关于文档的信息。您可以指定一个过滤器以仅检索与过滤器条件匹配的文档。
先决条件
您必须设置以下组件才能运行本指南中的代码示例
A
test.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 部署
首先,连接到 MongoDB 部署,然后声明并定义 MongoDatabase
和 MongoCollection
实例。
以下代码连接到在 localhost
的 27017
端口上运行的独立 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文档。
FindObservable
find()
方法返回FindObservable
类的实例。该类提供了各种方法,可以将其链接到find()
方法以修改查询的输出或行为,例如sort()
或projection()
,以及通过subscribe()
方法迭代结果。
投影
默认情况下,MongoDB中的查询返回匹配文档中的所有字段。要指定返回匹配文档中的字段,可以指定投影文档。
本查找操作示例包含一个投影Document
,指定匹配的文档仅包括name
、stars
和categories
字段。
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())
MongoDatabase
和 MongoCollection
实例是不可变的。在现有的 MongoDatabase
或 MongoCollection
实例上调用 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)
MongoDatabase
和 MongoCollection
实例是不可变的。在现有的 MongoDatabase
或 MongoCollection
实例上调用 withReadConcern()
返回一个新的实例,而不会影响被调用的实例。
在以下示例中,collWithReadConcern
实例具有 AVAILABLE
读取关注点,而 collection
的读取关注点不受影响
val collWithReadConcern = collection.withReadConcern(ReadConcern.AVAILABLE)
您可以构建 MongoClientSettings
、MongoDatabase
或 MongoCollection
实例,以包含读取关注点、读取优先级和写入关注点的组合。
例如,以下代码在集合级别设置了所有三个参数
val collection = database.getCollection("restaurants") .withReadPreference(ReadPreference.primary()) .withReadConcern(ReadConcern.MAJORITY) .withWriteConcern(WriteConcern.MAJORITY)