如何将 fetchNewObject 与 update.one ReactiveMongo 一起使用?
How to use fetchNewObject with update.one ReactiveMongo?
以前我使用 findAndUpdate 并可以添加 fetchNewObject = true
所以我可以在查询后做这样的事情:
.map(_.result[WhicherReport].getOrElse {
throw new NoSuchElementException
})
但是我现在正在使用事务,只能执行update.one(...)
并且没有传递它的选项fetchNewObject
,我该怎么办?
这是我的功能:
def someUpdateFunc(collection: BSONCollection, metadata: Metadata, ids: List[String]): Future[UpdateWriteResult] = {
collection.update.one(
q = Json.obj("metadata" -> metadata,
notLocked(now)),
u = Json.obj("$set" -> Json.obj("expenses.$[elem].paired" -> true)),
upsert = false,
multi = false,
arrayFilters = Seq(BSONDocument("elem.id" -> BSONDocument( "$in" -> ids))),
collation = None)
}
我想 return 使用 ReactiveMongo class 新的更新案例。
无法将 fetchNewObject
与 update
command 一起使用,因为它不是此命令支持的选项。
您似乎认为 findAndModify
不能与事务一起使用,事实并非如此:it can be used with transaction.
for {
ds <- db.startSession()
dt <- ds.startTransaction(None)
coll = dt.collection(colName)
_ <- coll.findAndUpdate(selector, james, upsert = true)
} yield ...
如果您出于未提及的原因仍想使用 update
,那么您将需要在同一事务中执行 find
。
P.S. .getOrElse { throw new NoSuchElementException }
is quite a code smell, which should be discouraged (and rather compose).
以前我使用 findAndUpdate 并可以添加 fetchNewObject = true
所以我可以在查询后做这样的事情:
.map(_.result[WhicherReport].getOrElse {
throw new NoSuchElementException
})
但是我现在正在使用事务,只能执行update.one(...)
并且没有传递它的选项fetchNewObject
,我该怎么办?
这是我的功能:
def someUpdateFunc(collection: BSONCollection, metadata: Metadata, ids: List[String]): Future[UpdateWriteResult] = {
collection.update.one(
q = Json.obj("metadata" -> metadata,
notLocked(now)),
u = Json.obj("$set" -> Json.obj("expenses.$[elem].paired" -> true)),
upsert = false,
multi = false,
arrayFilters = Seq(BSONDocument("elem.id" -> BSONDocument( "$in" -> ids))),
collation = None)
}
我想 return 使用 ReactiveMongo class 新的更新案例。
无法将 fetchNewObject
与 update
command 一起使用,因为它不是此命令支持的选项。
您似乎认为 findAndModify
不能与事务一起使用,事实并非如此:it can be used with transaction.
for {
ds <- db.startSession()
dt <- ds.startTransaction(None)
coll = dt.collection(colName)
_ <- coll.findAndUpdate(selector, james, upsert = true)
} yield ...
如果您出于未提及的原因仍想使用 update
,那么您将需要在同一事务中执行 find
。
P.S.
.getOrElse { throw new NoSuchElementException }
is quite a code smell, which should be discouraged (and rather compose).