我已经与ReactiveMongo合作了6个月。 这是用于Scala的MongoDB驱动程序的很好实现。 我只有一句话–它没有应有的良好文档。 特别糟糕的文档包含MongoDB运算符。 幸运的是,原始的MongoDB文档解决了这种情况。
因此,在本教程中,我想演示如何处理JSON数组。 我将研究$ pull和$ push运算符。 在文章的实践部分结束之后,希望您能获得有关如何使用ReactiveMongo(添加/删除)在数组中添加元素的问题的答案。
假设我们有一个这样的模型:
case class Person(_id: Option[BSONObjectID],
name: String,
phones: Option[Seq[String]])
object Person {
implicit val personWrites: Writes[Person] = (
(JsPath \ "_id").writeNullable[BSONObjectID] and
(JsPath \ "name").write[String] and
(JsPath \ "phones").writeNullable[Seq[String]]
)(unlift(Person.unapply))
implicit val personReads: Reads[Person] = (
(JsPath \ "_id").readNullable[BSONObjectID].map(_.getOrElse(BSONObjectID.generate)).map(Some(_)) and
(JsPath \ "name").read[String] and
(JsPath \ "phones").readNullable[Seq[String]]
)(Person.apply _)
}
如您所见,案例类Person具有“ phones”字段,由Seq [String]表示 。 它还用Option包裹,但并不是那么重要。 我们如何实现“电话”数组中元素的添加和删除操作? 答案隐藏在官方的MongoDB文档中。
要使用ReactiveMongo实现“添加到阵列”操作,我需要:
def addPhone(name: String, phone: String) = {
val newPhone = Json.obj(
"$push" -> Json.obj(
"phones" -> phone
)
)
collection.update(
Json.obj("name" -> name),
newPhone
)
}
请注意“名称”字段。 它必须是唯一的。 您可能还注意到了Json对象。 这是PlayFramework的课程。
为了删除“电话”阵列中的某些特定电话,我们需要:
def removePhone(name: String, phone: String) = {
val phoneToDelete = Json.obj(
"$pull" -> Json.obj(
"phones" -> phone
)
)
collection.update(
Json.obj("name" -> name),
phoneToDelete
)
}
我建议每次在ReactiveMongo文档中找不到您想要的东西时,都参考MongoDB官方文档。 这种方法在大多数情况下效果很好。
翻译自: https://www.javacodegeeks.com/2015/02/reactivemongo-work-with-array.html