如果我想在诸如 http4s 之类的东西中使用 ReactiveMongo,我必须将 ReactiveMongo 返回的所有 Future 调用包装在 Cats IO 效果中,这样说是否正确?
概括地说,将 ReactiveMongo 合并到 http4s 中需要哪些步骤?
我试图使用以下代码在Play 2.1中使用reactivemongo保存附件:
def upload = Action(parse.multipartFormData) { request =>
request.body.file("carPicture").map { picture =>
val filename = picture.filename
val contentType = picture.contentType
val gridFS = new GridFS(db, "attachments")
val fileToSave = DefaultFileToSave(filename, contentType)
val futureResult: Future[ReadFile[BSONValue]] = gridFS.writeFromInputStream(fileToSave, new FileInputStream(new File(filename)))
Ok(Json.obj("e" -> 0))
}.getOrElse {
Redirect(routes.Application.index).flashing(
"error" -> "Missing file"
)
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
找不到参数readFileReader的隐含值:reactivemongo.bson.BSONDocumentReader [reactivemongo.api.gridfs.ReadFile [reactivemongo.bson.BSONValue]] [error] val futureResult:Future [ReadFile [BSONValue]] = gridFS.writeFromInputStream(fileToSave, new FileInputStream(new File(filename)))
我错过了什么?
谢谢,
GA
为了做到空间查询MongoDB中的文档与位置(有2d或2dsphere地理空间指数)应该是这个样子:
{
_id: …,
loc: {
type: "Point",
coordinates: [ <longitude>, <latitude> ]
}
}
Run Code Online (Sandbox Code Playgroud)
我是Scala,ReactiveMongo和Play Framework的新手,但在我看来,使用这样一个位置的一个明显方法是通过一个案例类:
case class Point(lon: Double, lat: Double)
Run Code Online (Sandbox Code Playgroud)
网站的API处理的JSON表示应该类似于:
{
_id: …
loc: [ <longitude>, <latitude> ]
}
Run Code Online (Sandbox Code Playgroud)
现在,我无法弄清楚如何告诉我的ReactiveMongo模型在这些格式之间进行序列化/反序列化.
我的控制器看起来像这样:
package controllers
import play.api._
import play.api.mvc._
import play.api.libs.json._
import scala.concurrent.Future
// Reactive Mongo imports
import reactivemongo.api._
import scala.concurrent.ExecutionContext.Implicits.global
// Reactive Mongo plugin
import play.modules.reactivemongo.MongoController
import play.modules.reactivemongo.json.collection.JSONCollection
object Application extends Controller with MongoController {
def collection: JSONCollection = db.collection[JSONCollection]("test")
import play.api.data.Form
import …Run Code Online (Sandbox Code Playgroud) 我使用免费的MongoLab,我的数据库在周末升级到Mongo 3,现在我的客户端无法连接.我一直收到'未经授权的db.collection查询'.错误.
Mongolab说我应该使用Mongo 3兼容驱动程序(http://docs.mongodb.org/manual/release-notes/3.0-compatibility/#driver-compatibility-changes).我正在使用scala ReactiveMongo客户端,版本0.11.7,它应该支持Mongo 3.
我正在尝试使用以下方式在 MongoDB 中插入日期:
collection.insert(Json.obj("user"->"abc", "joined_date" -> DateTime.now))
Run Code Online (Sandbox Code Playgroud)
在数据库中:
{
"_id" : ObjectId("5865d99718969bca6a09450f"),
"user" : "abc",
"joined_date" : NumberLong("1483069847066")
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是日期以长毫秒格式存储在数据库中,但我想要的是它以 ISO 日期格式存储。
我在 MongoShell 中尝试保存相同的数据db.example.insert({user:"abc", joined_date:new Date()}),结果如下:
{
"_id" : ObjectId("5865d838a4f98c5bb83b1eb8"),
"user" : "abc",
"joined_date" : ISODate("2016-12-30T03:44:56.824Z")
}
Run Code Online (Sandbox Code Playgroud)
那么,如何使用 ReactiveMongo 在数据库中以 ISODate 格式存储日期?
scala mongodb playframework reactivemongo play-reactivemongo
我在BitBucket管道中运行的测试"突然"开始失败并出现此错误:无法识别的字段'snapshot'(代码= 9).
在本地测试都运行正常.本地和BitBucket我都使用Mongo 3.7 docker容器.活跃的Mongo版本是0.13.0
任何人都知道为什么会这样,以及如何解决这个问题?
我真的很困惑,我可能会错过一些明显的东西,所以如果有人能指出我正确的方向会很棒.
我有以下函数返回SimpleResult类型的未来,但它有一个单位.我不确定为什么会这样说,因为我正在映射futureList结果
def find(key: String, value: String) = Future[SimpleResult] {
val cursor: Cursor[JsObject] = coll.
find(Json.obj(key -> value)).
cursor[JsObject]
val futureList: Future[List[JsObject]] = cursor.collect[List]()
val futureResult: Future[SimpleResult] = futureList.map { item =>
if(item.isEmpty) {
Ok(JsArray()).as(JSON)
}
else
Ok(Json.toJson(item))
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
我从Marth的建议中将其改为以下内容
def find(key: String, value: String) = Future[SimpleResult] {
val cursor: Cursor[JsObject] = coll.
find(Json.obj(key -> value)).
cursor[JsObject]
val futureList: Future[List[JsObject]] = cursor.collect[List]()
futureList.map { item => Ok(Json.toJson(item)) }
}
Run Code Online (Sandbox Code Playgroud)
Eclipse警告以下内容
类型不匹配; 发现:scala.concurrent.Future [play.api.mvc.SimpleResult]必需:play.api.mvc.SimpleResult
虽然该函数是为了返回一个scala.concurrent.Future [play.api.mvc.SimpleResult]
我有一个使用ReactiveMongo和MongoDB的Play Framework应用程序,我有以下代码:
def categories(id: String): Future[Vector[Category]] = {...}
....
val categoriesFuture = categories(id)
for {
categories: Vector[Category] <- categoriesFuture
categoryIdsWithoutPerson: Vector[BSONObjectID] <- findCategoryIdsWithoutPerson(categories.map(_.id), personId) //Returns Future[Vector[BSONObjectID]]
categoriesWithoutPerson: Vector[Category] <- categories.filter(category => categoryIdsWithoutPerson.contains(category.id)) //Play cites the error here
} yield categoryIdsWithoutPerson
Run Code Online (Sandbox Code Playgroud)
为了解释这个代码,我去取Vector的Categories包裹在Future,因为这是ReactiveMongo如何汇总.在for理解中,我使用它Vector来从数据库中获取id列表.最后,我使用一个filter调用来保留那些id可以在id列表中找到的类别.
这一切看起来都相当简单.问题是Play在for理解的最后一行给出了以下编译错误:
pattern type is incompatible with expected type;
found : Vector[com.myapp.Category]
required: com.myapp.Category
Run Code Online (Sandbox Code Playgroud)
我不确定为什么所需类型是单个实例Category.
我可以使用一些洞察我做错了什么和/或是否有更简单或更惯用的方法来实现这一点.
我在斯卡拉建设一个活性位点和播放框架,以及我的数据模型是这样的,我经常需要编写Future和Option,并建立Future的List/ Set以前的值以得到结果,我所需要的.
我写了一个带有假数据源的简单应用程序,你可以复制和粘贴它,它应该编译.我的问题是,在我的情况下UserContext,如何以可消耗的形式取回结果.目前,我要回来了Future[Option[Future[UserContext]]].
我想在纯Scala中这样做以更好地学习语言,所以我现在正在避开Scalaz.虽然我知道我最终应该使用它.
package futures
import scala.concurrent.{Future, ExecutionContext}
// http://www.edofic.com/posts/2014-03-07-practical-future-option.html
case class FutureO[+A](future: Future[Option[A]]) extends AnyVal {
def flatMap[B](f: A => FutureO[B])(implicit ec: ExecutionContext): FutureO[B] = {
FutureO {
future.flatMap { optA =>
optA.map { a =>
f(a).future
} getOrElse Future.successful(None)
}
}
}
def map[B](f: A => B)(implicit ec: ExecutionContext): FutureO[B] = {
FutureO(future.map(_ map f))
}
}
// ========== USAGE OF FutureO BELOW ============= …Run Code Online (Sandbox Code Playgroud) 我使用 Scala 连接到 MongoDB:
val driver = new MongoDriver
val connection = driver.connection(List("myhost"))
val db = connection.database("mydb")
Run Code Online (Sandbox Code Playgroud)
这工作正常,但如何将其与 Play 控制器集成:
@Singleton
class ReactiveController @Inject() (implicit system: ActorSystem, materializer: Materializer, val reactiveMongoApi: ReactiveMongoApi)
extends Controller with MongoController with ReactiveMongoComponents {
Run Code Online (Sandbox Code Playgroud)
我需要在ReactiveMongoApi我的数据库配置中注入自定义吗?
或者我需要用我的数据库设置修改 application.conf 吗?
我正在使用 play 2.5 和http://reactivemongo.org/releases/0.11/documentation/tutorial/play2.html提供了这个代码:
package api
import reactivemongo.api.{ DB, MongoConnection, MongoDriver }
trait ReactiveMongoApi {
def driver: MongoDriver
def connection: MongoConnection
def db: DB
}
Run Code Online (Sandbox Code Playgroud)
但我不确定如何将它与我的 Play 应用程序集成?
我想我不知道使用 Play 配置数据库源的一些标准方法!应用 ?