快速入门
在此页面上
Overview
本指南中的代码示例来自 QuickTour.scala 驾驶员源代码Github 存储库中的文件。
注意
有关如何安装Scala驾驶员的说明,请参阅安装指南。
注意
本指南使用 Observable
隐式,如快速入门入门知识中所述。
先决条件
您必须设置以下组件才能运行本指南中的代码示例:
在 MongoDB 默认端口 (
27017
) 上运行的 MongoDB 服务器项目中安装的驱动程序依赖项
以下 import 语句:
import org.mongodb.scala._ import org.mongodb.scala.model.Aggregates._ import org.mongodb.scala.model.Filters._ import org.mongodb.scala.model.Projections._ import org.mongodb.scala.model.Sorts._ import org.mongodb.scala.model.Updates._ import org.mongodb.scala.model._ import scala.collection.JavaConverters._
建立连接
使用 MongoClient 伴随对象,用于连接到运行的MongoDB 部署。
MongoClient
实例表示数据库的连接池。 即使使用并发操作线程,也只需要一个MongoClient
实例。
重要
通常,您仅为给定 MongoDB 部署(例如独立部署、副本集或分片集群)仅创建一个MongoClient
实例,并在整个应用程序中使用该客户端。 但是,如果您确实创建了多个实例,请记住以下几点:
所有资源使用限制(例如最大连接数)均适用于每个
MongoClient
实例。要丢弃实例,请调用
MongoClient.close()
方法来清理资源。
连接到单个 MongoDB 部署
以下示例展示了连接到单个 MongoDB 部署的几种方法。
您可以通过以下方式连接到单个MongoDB 部署:
实例化一个不带任何参数的
MongoClient
对象,以连接到在本地主机上运行的 MongoDB 服务器的端口27017
:val mongoClient: MongoClient = MongoClient() 显式指定
hostname
以连接到在指定主机的端口27017
上运行的 MongoDB 实例:val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne")).asJava)) .build()) 显式指定
hostname
和port
:val mongoClient: MongoClient = MongoClient( MongoClientSettings.builder() .applyToClusterSettings((builder: ClusterSettings.Builder) => builder.hosts(List(new ServerAddress("hostOne", 27017)).asJava)) .build()) 指定
ConnectionString
:val mongoClient: MongoClient = MongoClient("mongodb://hostOne:27017")
访问数据库
将MongoClient
实例连接到 MongoDB 部署后,使用MongoClient.getDatabase()
方法访问数据库。
为getDatabase()
方法指定数据库的名称。 如果数据库不存在,MongoDB 会在您首次为该数据库存储数据时创建该数据库。
以下示例将访问mydb
数据库:
val database: MongoDatabase = mongoClient.getDatabase("mydb")
MongoDatabase
实例不可变。
访问集合
获得MongoDatabase
实例后,使用getCollection()
方法访问权限集合。
为getCollection()
方法指定集合的名称。 如果集合不存在, MongoDB会在您首次存储该集合。
示例,以下声明使用数据库实例访问mydb
数据库中名为test
的集合:
val collection: MongoCollection[Document] = database.getCollection("test")
MongoCollection
实例不可变。
创建文档
要使用驱动程序创建文档,请使用 文档 类。
例如,考虑以下JSON document :
{ "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { x : 203, y : 102 } }
要使用驾驶员创建文档,请实例化一个Document
对象:
val doc: Document = Document("_id" -> 0, "name" -> "MongoDB", "type" -> "database", "count" -> 1, "info" -> Document("x" -> 203, "y" -> 102))
插入文档
获得MongoCollection
对象后,您可以将文档插入到集合中。
插入一个文档
要将文档插入集合,请使用insertOne()
方法。 然后,使用results()
隐式助手进行区块,直到观察者完成:
collection.insertOne(doc).results()
警告
驾驶员提供两种文档类型:不可变的Document
和可变的Document
。
使用不可变文档时,如果将来需要知道_id
值,则应显式添加_id
值。
如果文档中没有指定顶级_id
字段, MongoDB会自动生成一个值并将该字段添加到插入的文档中,但不会将该_id
传回用户。
重要
在API中,所有返回Observable
实例的方法都是冷流,这意味着在它们被订阅之前不会发生任何事情。
例如,以下示例不执行任何操作:
val observable: Observable[InsertOneResult] = collection.insertOne(doc)
该操作仅在订阅Observable
并请求数据时发生。
observable.subscribe(new Observer[InsertOneResult] { override def onSubscribe(subscription: Subscription): Unit = subscription.request(1) override def onNext(result: InsertOneResult): Unit = println(s"onNext $result") override def onError(e: Throwable): Unit = println("Failed") override def onComplete(): Unit = println("Completed") })
插入文档后,系统会调用onNext()
方法并打印onNext
,然后打印结果。 最后, onComplete()
方法会打印Completed
。 如果由于任何原因出现错误, onError()
方法将打印Failed
。
插入多个文档
要插入多个文档,可以使用集合的insertMany()
方法,该方法获取要插入的文档列表。
以下示例按以下形式添加多个文档:
{ "i" : value }
在循环中创建文档并将它们添加到documents
列表中:
val documents = (1 to 100) map { i: Int => Document("i" -> i) }
要将这些文档插入到集合中,请将文档列表传递给insertMany()
方法:
val insertObservable = collection.insertMany(documents)
前面的示例会在Observable
上执行阻塞以完成操作。 这可确保在运行下一个操作之前数据已存储在数据库中。
对集合中的文档进行计数
要计算集合中的文档数量,可以使用集合的count()
方法。 以下代码应打印101
,描述使用insertMany()
100文档以及使用insertOne()
1插入的 。
使用for
理解式将这两个操作链接在一起。 以下代码会插入文档,然后计算文档数量并打印结果:
val insertAndCount = for { insertResult <- insertObservable countResult <- collection.countDocuments() } yield countResult println(s"Total # of documents: ${insertAndCount.headResult()}")
查询集合
要查询集合,可以使用集合的find()
方法。 您可以不带任何参数调用该方法来查询集合中的所有文档,也可以传递过滤来查询与过滤条件匹配的文档。
查找集合中的第一个文档
要返回集合中的第一个文档,请使用不带任何参数的find()
方法,并链接first()
方法。
提示
find().first()
构造对于只应匹配单个文档的查询或仅对第一个匹配的文档感兴趣时非常有用。
以下示例打印在集合中找到的第一个文档:
collection.find().first().printHeadResult()
该示例应打印以下文档:
{ "_id" : { "$oid" : "551582c558c7b4fbacf16735" }, "name" : "MongoDB", "type" : "database", "count" : 1, "info" : { "x" : 203, "y" : 102 } }
注意
_id
元素已由MongoDB自动添加到您的文档中,您的值将与显示的不同。 MongoDB保留以_
和$
开头的字段名称供内部使用。
查找集合中的所有文档
要检索集合中的所有文档,请使用find()
方法。 find()
方法返回一个FindObservable
实例,该实例为链接或控制查找操作提供流畅的接口。 以下代码检索并打印集合中的所有文档:
collection.find().printResults()
指定查询筛选器
要查询匹配特定条件的文档,请将过滤对象传递给find()
方法。 为了便于创建过滤对象,驾驶员提供了Filters
辅助方法。
获取与筛选器匹配的单个文档
要查找字段i
的值为71
的第一个文档,请传递eq()
过滤定义以指定相等条件:
collection.find(equal("i", 71)).first().printHeadResult()
该示例打印一个文档:
{ "_id" : { "$oid" : "..." }, "i" : 71 }
获取与筛选器匹配的所有文档
以下示例返回并打印i
值大于50
的所有文档:
collection.find(gt("i", 50)).printResults()
要为范围指定过滤器,例如50 < i <= 100
,可以使用and()
助手:
collection.find(and(gt("i", 50), lte("i", 100))).printResults()
Update Documents
要更新集合中的文档,可以使用集合的updateOne()
和updateMany()
方法。
将以下参数传递给这些方法:
筛选对象以确定要更新的一个或多个文档。 为了便于创建过滤对象,驾驶员提供了
Filters
辅助方法。 要指定空过滤并匹配集合中的所有文档,请使用空Document
对象。
更新方法返回UpdateResult
类型,其中提供有关操作的信息,包括更新修改的文档数量。
更新单份文档
要更新单个文档,请使用updateOne()
方法。
以下示例更新i
为10
的第一个文档,并将i
的值设置为110
:
collection.updateOne(equal("i", 10), set("i", 110)).printHeadResult("Update Result: ")
更新多个文档
要更新与查询筛选器匹配的所有文档,请使用updateMany()
方法。
以下示例在 值小于i
100
的所有文档中将 的值递增i
100
:
collection.updateMany(lt("i", 100), inc("i", 100)).printHeadResult("Update Result: ")
Delete Documents
要从集合中删除文档,可以使用集合的deleteOne()
和deleteMany()
方法。
传递过滤对象以确定要删除的一个或多个文档。 为了便于创建过滤对象,驾驶员提供了Filters
辅助方法。 要指定空过滤并匹配集合中的所有文档,请使用空Document
对象。
删除方法返回DeleteResult
,其中提供有关操作的信息,包括删除的文档数。
删除与筛选器匹配的单个文档
要删除与筛选器匹配的单个文档,请使用deleteOne()
方法。
以下示例删除了i
的值等于110
的第一个文档:
collection.deleteOne(equal("i", 110)).printHeadResult("Delete Result: ")
删除与筛选器匹配的所有文档
要删除与过滤匹配的所有文档,请使用deleteMany()
方法。
以下示例删除i
值大于或等于100
的所有文档:
collection.deleteMany(gte("i", 100)).printHeadResult("Delete Result: ")
createIndexes
要在一个或多个字段上创建索引,请将索引规范文档传递给createIndex()
方法。 索引键规范文档包含要索引的字段以及每个字段的索引类型,由以下文档建模:
Document(<field1> -> <type1>, <field2>, <type2>, ...)
要创建升序索引类型,请为 指定1
<type>
。要创建降序索引类型,请为 指定-1
<type>
。
以下示例在i
字段上创建一个升序索引:
collection.createIndex(Document("i" -> 1)).printHeadResult("Create Index Result: %s")
要查看其他索引类型的列表,请参阅创建索引指南。
更多信息
快速入门(案例类示例)指南演示了如何将驾驶员与案例类结合使用。
您可以在“教程”部分找到其他教程。