Mongodb 我应该如何在play2应用程序中构造嵌套的reactivemongo调用?
我正在尝试将一些嵌套调用与play2应用程序中的reactivemongo结合起来。 我得到了从Mongodb 我应该如何在play2应用程序中构造嵌套的reactivemongo调用?,mongodb,scala,asynchronous,playframework,playframework-2.1,Mongodb,Scala,Asynchronous,Playframework,Playframework 2.1,我正在尝试将一些嵌套调用与play2应用程序中的reactivemongo结合起来。 我得到了从createObjects返回的对象列表。然后我在它们上面循环,检查对象是否存在于集合中,如果不存在,则插入它们: def dostuff() = Action { implicit request => form.bindFromRequest.fold( errors => BadRequest(views.html.invite(errors)),
createObjects
返回的对象列表。然后我在它们上面循环,检查对象是否存在于集合中,如果不存在,则插入它们:
def dostuff() = Action {
implicit request =>
form.bindFromRequest.fold(
errors => BadRequest(views.html.invite(errors)),
form => {
val objectsReadyForSave = createObjects(form.companyId, form.companyName, sms_pattern.findAllIn(form.phoneNumbers).toSet)
Async {
for(object <- objectsReadyForSave) {
collection.find(BSONDocument("cId" -> object.get.cId,"userId" ->
object.userId.get)).cursor.headOption.map { maybeFound =>
maybeFound.map { found =>
Logger.info("Found record, do not insert")
} getOrElse {
collection.insert(object)
}
}
}
Future(Ok(views.html.invite(form)))
}
})
}
def dostuff()=操作{
隐式请求=>
form.bindFromRequest.fold(
errors=>BadRequest(views.html.invite(errors)),
形式=>{
val objectsReadyForSave=createObjects(form.companyId、form.companyName、sms_pattern.findAllIn(form.phoneNumbers).toSet)
异步的{
对于(object.get.cId,“userId”->
object.userId.get)).cursor.headOption.map{maybeFound=>
maybeFound.map{found=>
Logger.info(“找到记录,不插入”)
}盖托莱尔斯{
集合.插入(对象)
}
}
}
Future(Ok(views.html.invite(form)))
}
})
}
我觉得这种方式没有它能做到的那么好,感觉不是“play2”和“reactivemongo”。
所以我的问题是:我应该如何构造嵌套调用以获得我想要的结果
并获取已插入哪些对象的信息?以下是我如何重写的
def dostuff() = Action { implicit request =>
form.bindFromRequest.fold(
errors => BadRequest(views.html.invite(errors)),
form => {
createObjects(form.companyId,
form.companyName,
sms_pattern.findAllIn(form.phoneNumbers).toSet).map(ƒ)
Ok(views.html.invite(form))
}
)
}
// ...
// In the model
// ...
def ƒ(cId: Option[String], userId: Option[String], logger: Logger) = {
// You need to handle the case where obj.cId or obj.userId are None
collection.find(BSONDocument("cId" -> obj.cId.get, "userId" -> obj.userId.get))
.cursor
.headOption
.map { maybeFound =>
maybeFound map { _ =>
logger.info("Record found, do not insert")
} getOrElse {
collection.insert(obj)
}
}
}
可能有一些语法错误,但想法是存在的。下面是我如何重写它的
def dostuff() = Action { implicit request =>
form.bindFromRequest.fold(
errors => BadRequest(views.html.invite(errors)),
form => {
createObjects(form.companyId,
form.companyName,
sms_pattern.findAllIn(form.phoneNumbers).toSet).map(ƒ)
Ok(views.html.invite(form))
}
)
}
// ...
// In the model
// ...
def ƒ(cId: Option[String], userId: Option[String], logger: Logger) = {
// You need to handle the case where obj.cId or obj.userId are None
collection.find(BSONDocument("cId" -> obj.cId.get, "userId" -> obj.userId.get))
.cursor
.headOption
.map { maybeFound =>
maybeFound map { _ =>
logger.info("Record found, do not insert")
} getOrElse {
collection.insert(obj)
}
}
}
可能有一些语法错误,但想法是存在的。我不是mongoDB方面的专家,也不是ReactiveMongo方面的专家,但似乎您正试图以与使用标准SQL数据库相同的方式使用NoSQL数据库。请注意,mongoDB是异步的,这意味着操作可能会在将来执行,这就是插入/更新操作不会返回受影响文档的原因。关于你的问题: 1如果对象不存在,则插入对象,并获取已插入对象的信息 您可能应该查看mongoDB方法,并使用
upsert
参数true调用它。若您负担得起,这将更新数据库中已经存在的文档,或者以其他方式插入文档。同样,此操作不会返回受影响的文档,但您可以通过访问来检查有多少文档受到影响。查看哪个返回未来[LastError]
2对于插入的所有对象,将它们添加到列表中,然后使用Ok()调用返回该列表
同样,插入/更新的文档将不会被返回。如果确实需要返回完整的受影响文档,则需要进行另一个查询以检索匹配的文档
我可能会这样重写您的代码(没有错误/故障处理):
def dostuff()=操作{
隐式请求=>
form.bindFromRequest.fold(
errors=>BadRequest(views.html.invite(errors)),
形式=>{
val objectsReadyForSave=createObjects(form.companyId、form.companyName、sms_pattern.findAllIn(form.phoneNumbers).toSet)
异步的{
val操作=用于{
data data.cId.get,“userId”->data.userId.get),data,upsert=true)
Future.sequence(operations).map{
lastErrors=>
确定(“文档可能已插入/更新!”)
}
}
}
)
}
另见Scala Futures:
这真的很有用!;)我不是mongoDB方面的专家,也不是ReactiveMongo方面的专家,但似乎您正试图以与使用标准SQL数据库相同的方式使用NoSQL数据库。请注意,mongoDB是异步的,这意味着在将来可能会执行操作,这就是插入/更新操作不会重新执行的原因受影响的文件。关于您的问题: 1如果对象不存在,则插入对象,并获取已插入对象的信息 您可能应该查看mongoDB方法,并使用
upsert
参数将其调用为true。如果您负担得起,这将更新数据库中已存在的文档,或者以其他方式插入文档。同样,此操作不会返回受影响的文档,但您可以检查有多少文档受到access的影响正在初始化。请参阅哪个返回未来[LastError]
2对于插入的所有对象,将它们添加到列表中,然后使用Ok()调用返回该列表
同样,插入/更新的文档将不会返回。如果确实需要返回完整的受影响文档,则需要进行另一次查询以检索匹配的文档
我可能会这样重写您的代码(没有错误/故障处理):
def dostuff()=操作{
隐式请求=>
form.bindFromRequest.fold(
errors=>BadRequest(views.html.invite(errors)),
形式=>{
val objectsReadyForSave=createObjects(form.companyId、form.companyName、sms_pattern.findAllIn(form.phoneNumbers).toSet)
异步的{
val操作=用于{
data data.cId.get,“userId”->data.userId.get),data,upsert=true)
Future.sequence(operations).map{
lastErrors=>
确定(“文档可能已插入/更新!”)
}
}
}
)
}
另见Scala Futures:
这真的很有用!;)谢谢你的回答!如果我不在模型中处理这个问题,而是创建一个def dostuff(object:MyObject)={}方法并调用.map(dostuff)呢?这意味着你将在模型中处理表单内容,这在我看来是相当混乱的。我理解,但如果你看一看reactivemongo示例,它们通常都是这样