快速入门(案例类示例)
在此页面上
Overview
本指南与快速入门指南类似,但使用案例类对文档进行建模,而不是使用通用的 Document
类。
本指南中的代码示例来自 QuickTourCaseClass.scala 驱动程序源代码Github 存储库中的文件。
重要
有关使用宏为MongoCollection
实例配置案例类支持的信息,请参阅BSON 宏文档。
首先,创建要用于表示集合中文档的案例类。 以下代码创建一个Person
案例类和伴生对象:
import org.mongodb.scala.bson.ObjectId object Person { def apply(firstName: String, lastName: String): Person = Person(new ObjectId(), firstName, lastName) } case class Person(_id: ObjectId, firstName: String, lastName: String)
注意
在伴生对象中, apply()
方法可以在创建不包含 _id
的新实例时自动分配值。 在MongoDB中, _id
字段表示文档的主键,因此通过在案例类中包含_id
字段,您可以允许访问权限主键。
配置案例类
将Person
与集合一起使用时,必须有一个可以将其与BSON相互转换的Codec
。 org.mongodb.scala.bson.codecs.Macros
伴生对象提供的宏可以在编译时自动为案例类生成编解码器。 以下示例创建了一个新的CodecRegistry
,其中包括Person
案例类的编解码器:
import org.mongodb.scala.bson.codecs.Macros._ import org.mongodb.scala.MongoClient.DEFAULT_CODEC_REGISTRY import org.bson.codecs.configuration.CodecRegistries.{fromRegistries, fromProviders} val codecRegistry = fromRegistries(fromProviders(classOf[Person]), DEFAULT_CODEC_REGISTRY )
配置CodecRegistry
后,下一步是创建MongoCollection[Person]
。 以下示例使用mydb
数据库中的test
集合:
val mongoClient: MongoClient = MongoClient() val database: MongoDatabase = mongoClient.getDatabase("mydb").withCodecRegistry(codecRegistry) val collection: MongoCollection[Person] = database.getCollection("test")
注意
可以在创建MongoClient
时、数据库级别或集合级别设置CodecRegistry
。 该 API 非常灵活,可根据需要使用不同的CodecRegistry
实例。
插入人员
使用正确配置的MongoCollection
后,将Person
实例插入集合就很简单:
val person: Person = Person("Ada", "Lovelace") collection.insertOne(person).results()
插入多个 Person 实例
要插入多个Person
实例,请使用insertMany()
方法。 以下示例使用printResults()
隐式并阻塞,直到观察器完成,然后打印每个结果:
val people: Seq[Person] = Seq( Person("Charles", "Babbage"), Person("George", "Boole"), Person("Gertrude", "Blanch"), Person("Grace", "Hopper"), Person("Ida", "Rhodes"), Person("Jean", "Bartik"), Person("John", "Backus"), Person("Lucy", "Sanders"), Person("Tim", "Berners Lee"), Person("Zaphod", "Beeblebrox") ) collection.insertMany(people).printResults()
此代码输出以下消息:
The operation completed successfully
查询集合
使用find()
方法查询集合。
查找第一个匹配的人员
查询集合使用的 API 与快速入门中使用的 API 相同:
collection.find().first().printHeadResult()
该示例打印集合中的第一个Person
:
Person(58dd0a68218de22333435fa4, Ada, Lovelace)
返回所有文档
要检索集合中的所有文档,请使用find()
方法。 find()
方法返回一个FindObservable
实例,该实例为链接或控制查找操作提供流畅的接口。 以下示例会将集合中的所有文档打印为Person
实例:
collection.find().printResults()
使用查询筛选器检索人员
要返回集合中文档的子集,请将筛选器传递给find()
方法。 例如,以下示例返回名字为Person
的第一个"Ida"
:
import org.mongodb.scala.model.Filters._ collection.find(equal("firstName", "Ida")).first().printHeadResult()
此示例输出以下结果:
Person(58dd0a68218de22333435fa4, Ida, Rhodes)
提示
您可以使用Filters
、 Sorts
、 Projections
和Updates
辅助方法启用简单明了的方式构建查询。
查找匹配的 Person 实例
以下过滤查找 以 开头的所有Person
firstName
"G"
实例,并按lastName
排序:
collection.find(regex("firstName", "^G")).sort(ascending("lastName")).printResults()
此示例打印输出"Gertrude"
、 "George"
和"Grace"
的Person
实例。
Update Documents
MongoDB 支持许多更新操作符。 使用Updates
助手帮助更新集合中的文档。
以下更新更正了"Tim Berners-Lee"
的连字符:
collection.updateOne(equal("lastName", "Berners Lee"), set("lastName", "Berners-Lee")) .printHeadResult("Update Result: ")
更新方法返回UpdateResult
,其中提供有关操作的信息,包括更新修改的文档数。
Delete Documents
要最多删除一个文档,或者在没有文档与过滤器匹配的情况下不删除文档,请使用deleteOne()
方法:
collection.deleteOne(equal("firstName", "Zaphod")).printHeadResult("Delete Result: ")