我们最近升级到了Play 2.7.0,并使用play2-reactivemongo版本0.16.2和reactmongo 0.16.3。我们使用reactivemongo-shaded-native但也尝试不使用。
我们正在连接到具有3个节点的副本集,即MongoDB Atlas上的MongoDB 3.6.10。
初始连接良好,服务运行了一段时间。
但是最后我们遇到了这个错误:
[error] 2019-02-15 09:40:30,466 r.api.Failover2 - [Supervisor-1/Connection-2] Got an error, no more attempts to do. Completing with a failure...
reactivemongo.core.actors.Exceptions$PrimaryUnavailableException: MongoError['No primary node is available! (Supervisor-1/Connection-2)']
Caused by: reactivemongo.core.actors.Exceptions$InternalState: null
at reactivemongo.ConnectAll$IsMaster(400, {{NodeSet Some(PlayappDevelopment-shard-0) Node[playappdevelopment-shard-00-00-tedsb.mongodb.net:27017: Unknown (20/20 available connections), latency=9223372036854775807, authenticated={Authenticated(admin,playapp_rw)}] | Node[playappdevelopment-shard-00-01-tedsb.mongodb.net:27017: Secondary (20/20 available connections), latency=135, authenticated={Authenticated(admin,playapp_rw)}] | Node[playappdevelopment-shard-00-02-tedsb.mongodb.net:27017: Secondary (20/20 available connections), latency=140, authenticated={Authenticated(admin,playapp_rw)}] }})(<time:1550223615628>)
at reactivemongo.IsMaster(400, {{NodeSet Some(PlayappDevelopment-shard-0) Node[playappdevelopment-shard-00-00-tedsb.mongodb.net:27017: Unknown (20/20 available connections), latency=9223372036854775807, authenticated={Authenticated(admin,playapp_rw)}] | Node[playappdevelopment-shard-00-01-tedsb.mongodb.net:27017: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Play-ReactiveMongo插件在Play和Angular中读取/写入MongoDB中的简单记录.该插件似乎是一个不错的选择,因为它允许您使用简单的案例类和常规JSON,而不是在BSON和JSON之间显式转换.但是使用插件的几个例子似乎没有涵盖如何在同一框架内将MongoDB对象ID映射到JSON或从JSON映射.这一切似乎都适用于在后台加载隐式(=魔术给我)读取/写入,但它们似乎不处理对象ID.
我的代码基于Alex Lashford的现代Web模板,与使用JSON读/写的Stephan Godbillion的示例非常相似,但Alex和Stephan都没有显示与MongoDB对象ID有关的任何内容.
我的数据记录需要某种唯一的ID,所以我可以获取和更新它们等等,使用MongoDB提供的那个是有意义的,但我似乎无法在Play ReactiveMongo中找到一种干净利用的方法.插入.
有没有人知道一个例子,它展示了如何将Play ReactiveMongo插件与JSON集合一起使用,以及某种方式将对象ID映射到/从JSON,而不必将我的所有处理转换为使用BSON?
我尝试使用play 2.5.12升级到reactive mongo 0.12.1,但是当我运行JVM退出时,我得到以下堆栈跟踪:
来自线程[application-akka.actor.default-dispatcher-2]的未捕获错误因为'akka.jvm-exit-on-fatal-error'为ActorSystem [application]启用而关闭JVM java.lang.NoClassDefFoundError:play/api/javas/concurrent/StateMachine at java.lang.ClassLoader.defineClass1(Native Method)at java.security.ClassLoader.defineClass(ClassLoader.java:763)at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)at java java.net上的..net.URLClassLoader.defineClass(URLClassLoader.java:467)java.net.URLClassLoader.access $ 100(URLClassLoader.java:73)java.net.URLClassLoader $ 1.run(URLClassLoader.java:368). URLClassLoader $ 1.run(URLClassLoader.java:362)java.security.AccessController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(URLClassLoader.java:361)at java.lang.ClassLoader.loadClass(ClassLoader.java) :424)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)at play.api.libs.streams.impl.EnumeratorSubscriptionFactory $ class.createSubscription(Enumerator)Publisher.scala:25)at play.api.libs.streams.impl.EnumeratorPublisher.createSubscription(EnumeratorPublisher.scala:33)at play.api.libs.streams.impl.EnumeratorPublisher.createSubscription(EnumeratorPublisher.scala:33)at play .api.libs.streams.impl.RelaxedPublisher.subscribe(RelaxedPublisher.scala:19)at akka.stream的akka.stream.impl.MaterializerSession.akka $ stream $ impl $ MaterializerSession $$ doSubscribe(StreamLayout.scala:1033). impa.MaterializerSession.assignPort(StreamLayout.scala:1025)at akka.stream.impl.MaterializerSession $$ anonfun $ exitScope $ 2.apply(StreamLayout.scala:907)at akka.stream.impl.MaterializerSession $$ anonfun $ exitScope $ 2.在scala.collection.Iterator $ class.foreach(Iterator.scala:893)的scala.collection.AbstractIterator.foreach(Iterator.scala:1336)at akka.stream.impl.MaterializerSession.exitScope上申请(StreamLayout.scala:906) (StreamLayout.scala:906)akka.stream.impl.MaterializerSession $$ anonfun $ materializeModule $ 1.apply(StreamLayout.scala:958)at akka.stream.impl.Mat erializerSession $$ anonfun $ materializeModule $ 1.apply(StreamLayout.scala:950)at scala.collection.immutable.Set $ Set3.foreach(Set.scala:163)at akka.stream.impl.MaterializerSession.materializeModule(StreamLayout.scala: 950)akka.stream.impl.MaterializerSession.materialize(StreamLayout.scala:917)at …
scala mongodb playframework playframework-2.0 play-reactivemongo
很多时候,当代码更改后Play重新加载应用程序时,我收到以下错误:
MongoError ['无法访问节点集!请检查您的网络连接.']
MongoDB日志如下所示:
2016-09-06T18:51:22.609+0200 I NETWORK [initandlisten] waiting for connections on port 27017
2016-09-06T18:53:49.916+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60559 #1 (1 connection now open)
2016-09-06T18:53:51.185+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60561 #2 (2 connections now open)
2016-09-06T18:53:51.196+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60562 #3 (3 connections now open)
2016-09-06T18:53:51.206+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60563 #4 (4 connections now open)
2016-09-06T18:53:51.217+0200 I NETWORK [initandlisten] connection accepted from 127.0.0.1:60564 #5 (5 connections now open)
2016-09-06T18:53:51.227+0200 …Run Code Online (Sandbox Code Playgroud) scala mongodb playframework reactivemongo play-reactivemongo
我正在尝试使用以下方式在 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
我目前升级到0.12.RC3,希望能解决我遇到的以下问题.升级后,我收到了该collect方法的弃用警告.
所以我离开了:
def find(query: JsObject = Json.obj())(implicit reader: Reads[T]): Future[List[T]] = {
collection.flatMap(_.find(query).cursor[T](ReadPreference.nearest).collect[List]())
}
Run Code Online (Sandbox Code Playgroud)
至:
def find(query: JsObject = Json.obj())(implicit reader: Reads[T]): Future[List[T]] = {
collection.flatMap(_.find(query).cursor[T](ReadPreference.nearest).collect[List](Int.MaxValue, Cursor.FailOnError()))
}
Run Code Online (Sandbox Code Playgroud)
但是,遗憾的是我收到以下错误:
类型不匹配,预期:(JSONCollection)=> Future [NotInferedS],actual:(JSONCollection)=> Any
我正在尝试使用以下方法创建一个向mongoddb插入数据的帖子请求:1.sbt 0.13.6 2.播放2.10 3. scala 2.11.2 4. play2-reactivamongo 0.10.2 5. mongodb 2.6.4
数据由json发布,并为模型创建一个case类,并使用JSPath将json转换为实体类.
这是我的示例代码:
def inserTransaction = Action(parser.json) { implicit request =>
val json = request.body
val data = json.as[Transaction]
Logger.info(data.toString)
val future = collection.insert(data.copy(id = Option[BSONObjectID](BSONObjectID.generate)))
var result = ""
future.onComplete {
case Failure(t) => result = "An error has occured: " + t.getMessage
case Success(post) => result = "success"
}
Ok(result)
}
Run Code Online (Sandbox Code Playgroud)
我已经看到一些示例代码使用Action.sync来处理控制器中的异步,但是当我尝试使用Action.sync时,我的Intellij IDE检测到错误"无法将Action.sync解析为签名",我试图改变像这样的功能的结果
future.onComplete {
case Failure(t) => Ok("An error has occured: " + t.getMessage)
case Success(post) …Run Code Online (Sandbox Code Playgroud) 让我们考虑一下我有一个users具有age属性的集合。现在,我要计算集合中的所有文档users或仅统计与age属性匹配的文档。因此,我做了以下工作:
def count(age: Option[Int] = None) = {
if (age.isEmpty) roles.count()
else users.count(Json.obj("age" -> age))
}
Run Code Online (Sandbox Code Playgroud)
问题是users.count(Json.obj("age" -> age))抛出编译错误,因为count反应性mongo提供的方法需要类型Option[pack.Document]。知道我该如何解决吗?
如果重要的话,我正在使用Reactive Mongo版本0.11.11。