ReactiveMongo:使用数组

反应性mongo徽标 我已经与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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值