【发布时间】:2016-08-05 08:43:50
【问题描述】:
我正在尝试将我的 mongo 数据库转储到一个 json 对象中,但是因为我对数据库的查询是异步的,所以我遇到了问题。
我的数据库中的每个集合都包含用户数据,每个集合名称都是一个用户名。
因此,当我想获取所有用户数据时,我会恢复所有集合名称,然后遍历它们以逐个恢复每个集合。
def databaseDump(prom : Promise[JsObject]) = {
for{
dbUsers <- getUsers
} yield dbUsers
var rebuiltJson = Json.obj()
var array = JsArray()
res.map{ users =>
users.map{ userNames =>
if(userNames.size == 0){
prom failure new Throwable("Empty database")
}
var counter = 0
userNames.foreach { username =>
getUserTables(username).map { tables =>
/* Add data to array*/
...
counter += 1
if(counter == userNames.size){
/*Add data to new json*/
...
prom success rebuiltJson
}
}
}
}
}
这有点工作,但有时即使所有数据尚未恢复,promise 也会成功触发。这是因为我的计数器变量不是一个可靠的解决方案。
有没有办法遍历所有用户,查询数据库并等待所有数据恢复,然后才能成功触发承诺?我试图用于理解,但没有找到方法。有没有办法将整个 mongo DB 转储到一个 Json 中:{ username : data, username : data ..}?
【问题讨论】:
-
对于这样的数据库管理任务,我不认为使用驱动程序编写新的东西是正确的方法。实用程序
mongodump可以直接以 JSON 格式获取数据。除此之外,我建议您查看文档以了解如何使用find document using ReactiveMongo,以及JSON serialization 的用途。 -
我需要在 scala 中执行此操作,因为我正在编写 API。所以我恢复的数据被发送到其他功能进行处理。我使用 JSON 序列化,但我不知道如何使用它来一次获取整个数据库,而不是逐个收集。
-
“转储”“只是”查找某些文档的(全部)文档的特定情况(再次强调,一个用例通常由专用的数据库管理工具处理)。
-
我明白这一点,但我想将我的整个数据库作为 JsObject 获取,这样我只需查询我的数据库一次而不是多次。而且我不知道如何在 Scala 中使用响应式 mongo scala 驱动程序来做到这一点。
-
没有单一的操作可以做到这一点,因为这不是一个常见的用例。有列出集合的操作,以及在每个文档中查找文档的操作,您可以尝试自己做。
标签: scala reactivemongo