Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 我应该如何在play2应用程序中构造嵌套的reactivemongo调用?_Mongodb_Scala_Asynchronous_Playframework_Playframework 2.1 - Fatal编程技术网

Mongodb 我应该如何在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)),

我正在尝试将一些嵌套调用与play2应用程序中的reactivemongo结合起来。 我得到了从
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示例,它们通常都是这样