使用 ReactiveMongo 和 akka 成功更新查询后如何调用查找查询,出现 None.get 异常
How can I call the find query after successful update query with ReactiveMongo and akka, getting None.get exception
我的代码中有两个查询
第一个是update
查询
var modifier = BSONDocument("$set" -> BSONDocument("client_id" -> client_id,
"access_token" -> access_token,
"refresh_token" ->refresh_token,
"inserted_date" -> inserted_date))
var selecter = BSONDocument("$and" -> BSONArray(BSONDocument("account_id" -> account_id), BSONDocument("refresh_token" -> object.refreshToken)))
tokensCollection.update(selecter, modifier)
第二个是find
查询
var query = BSONDocument("$and" -> BSONArray(BSONDocument("account_id" -> account_id), BSONDocument("refresh_token" -> refresh_token)))
val resp = tokensCollection.find(query).one[AccessTokens]
var result = Await.result(resp, 15 seconds)
result.get
我的第二个 find
查询在第一个查询 update
之前执行。我得到了问题
method have exception:java.util.NoSuchElementException: None.get
如何在第一个查询成功更新后调用查找查询
这是因为更新比查找需要更多时间 query.You 必须序列化 query.You 必须等待更新查询的响应,然后再执行查找查询。
我希望您的 tokensCollection.update()
电话也会 return 某种形式的 Future[_]
。只有当 Future
完成后,您的结果才能保证在数据库中可用。
你可以像这样序列化两个:
val resp = tokensCollection.update(s, m).flatMap(_ => tokensCollection.find(query))
或者,使用 for
理解:
for {
_ <- tokensCollection.update(s, m)
q <- tokensCollection.find(query)
} yield q
请注意,Await
不是您应该在生产中使用的东西;相反,return Future
无处不在,并在最终结果上调用 map
。但是,如果您只是玩玩,它对调试很有用。
我的代码中有两个查询
第一个是update
查询
var modifier = BSONDocument("$set" -> BSONDocument("client_id" -> client_id,
"access_token" -> access_token,
"refresh_token" ->refresh_token,
"inserted_date" -> inserted_date))
var selecter = BSONDocument("$and" -> BSONArray(BSONDocument("account_id" -> account_id), BSONDocument("refresh_token" -> object.refreshToken)))
tokensCollection.update(selecter, modifier)
第二个是find
查询
var query = BSONDocument("$and" -> BSONArray(BSONDocument("account_id" -> account_id), BSONDocument("refresh_token" -> refresh_token)))
val resp = tokensCollection.find(query).one[AccessTokens]
var result = Await.result(resp, 15 seconds)
result.get
我的第二个 find
查询在第一个查询 update
之前执行。我得到了问题
method have exception:java.util.NoSuchElementException: None.get
如何在第一个查询成功更新后调用查找查询
这是因为更新比查找需要更多时间 query.You 必须序列化 query.You 必须等待更新查询的响应,然后再执行查找查询。
我希望您的 tokensCollection.update()
电话也会 return 某种形式的 Future[_]
。只有当 Future
完成后,您的结果才能保证在数据库中可用。
你可以像这样序列化两个:
val resp = tokensCollection.update(s, m).flatMap(_ => tokensCollection.find(query))
或者,使用 for
理解:
for {
_ <- tokensCollection.update(s, m)
q <- tokensCollection.find(query)
} yield q
请注意,Await
不是您应该在生产中使用的东西;相反,return Future
无处不在,并在最终结果上调用 map
。但是,如果您只是玩玩,它对调试很有用。