【问题标题】:Using array filters when updating a document with ReactiveMongo使用 ReactiveMongo 更新文档时使用数组过滤器
【发布时间】:2021-10-27 18:17:11
【问题描述】:

有没有办法在 ReactiveMongoDB (19.2) 中使用 MongoDB 的 identifier update array filter?想象一个 db 集合模式:

{
    "_id": ObjectId("617942b33b850d6bbc490420"),
    "provider": "Google",
    "myArr_e": [
        {
            "name": "cloud",
            "lastDate": ISODate("2021-10-27T18:00:00.000+00:00")
        }
    ]
}

我想更新文档 ID 为 ObjectId("617942b33b850d6bbc490420")myArr_e.name 为“云”的 lastDate 字段。我可以使用以下方法在 MongoDB 中成功编写查询:

db.apv.updateOne({ "_id": ObjectId("617942b33b850d6bbc490420") }, { $set: { "myArr_e.$[elem].lastDate": new Date() }}, { "arrayFilters": [{ "elem.name": "cloud" }]});

但我无法在我的应用程序中使用 ReactiveMongoDB 执行此操作。这是我最好的尝试:

  def getCollection(collName: String): Future[JSONCollection]

  def updateMyArr: Future[WriteResult] = {

    val q = obj("_id" -> obj("$oid" -> "617942b33b850d6bbc490420"))
    val u = obj("$set" -> obj("myArr_e.$[elem].lastDate" -> new Date()))
    val af = obj("arrayFilters" -> arr(obj("elem.name" -> "cloud")))

    for {
      coll <- getCollection("collName")
      uwr <- coll.update.one(q, u, upsert = false, multi = false, collation = None, arrayFilters = af)
    } yield {
      uwr
    }

  }

我从中获得了 http 202,但我可以看到该文档尚未更新。这在 ReactiveMongoDB (19.2) 中可行吗?我试图找到这方面的文档,但如果它在那里,那么它就对我隐藏了。谢谢_

【问题讨论】:

    标签: mongodb reactivemongo


    【解决方案1】:

    这实际上是在今天早上正确编辑文档,所以这一定是我,但我想留下它,以防有人正在寻找如何执行此操作的示例。也只需稍作修改,以确保将 ISODate 类型写入字段而不是 Long 类型和根据 the documentation 构造更新对象的最聪明的方法:

    val u = obj("$currentDate" -&gt; obj("myArr_e.$[elem].lastDate" -&gt; true))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      相关资源
      最近更新 更多