当前位置: 首页 > 知识库问答 >
问题:

播放ReactiveMongo:封顶集合和可裁剪光标

越琦
2023-03-14

我正在使用Scala、Akka和ReactiveMongo的Play框架。我想使用MongoDB中的集合作为循环队列。几个参与者可以在其中插入文件;一个参与者在这些文档可用时立即检索它们(一种发布-订阅系统)。我使用的是封顶系列和可裁剪光标。我总是用flush命令从同一个集合中检索所有元素,否则我就不可能用flush命令从该集合中检索所有元素。有没有替代方案?例如,有没有一种方法可以在不移除元素的情况下滑动光标?或者在我的情况下最好不要使用capped collection?

object MexDB {

def db: reactivemongo.api.DB = ReactiveMongoPlugin.db
val size: Int = 10000

// creating capped collection
val collection: JSONCollection = {

    val c = db.collection[JSONCollection]("messages")

    val isCapped = coll.convertToCapped(size, None)

    Await.ready(isCapped, Duration.Inf)

    c
}

def insert(mex: Mex) = {

    val inserted = collection.insert(mex)

    inserted onComplete {
      case Failure(e) =>
        Logger.info("Error while inserting task: " + e.getMessage())
        throw e

      case Success(i) =>
        Logger.info("Successfully inserted task")
    }

}


def find(): Enumerator[Mex] = {

  val cursor: Cursor[Mex] = collection
    .find(Json.obj())
    .options(QueryOpts().tailable.awaitData)
    .cursor[Mex]

    // meaning of maxDocs ???
    val maxDocs = 1
    cursor.enumerate(maxDocs)
}


def removeAll() = {
    db.command(new EmptyCapped("messages"))
}

}

/*** part of receiver actor code ***/

// inside preStart
val it = Iteratee.fold[Mex, List[Mex]](Nil) {
    (partialList, mex) => partialList ::: List(mex)
}

// Inside "receive" method
case Data =>

  val e: Enumerator[Mex] = MexDB.find()

  val future = e.run(it)

  future onComplete {
    case Success(list) =>
      list foreach { mex =>
        Logger.info("Mex: " + mex.id)
      }
      MexDB.removeAll()
      self ! Data

    case Failure(e) => Logger.info("Error:  "+ e.getMessage())
  }

共有1个答案

郗浩
2023-03-14

在每个找到的文档之后,您的可裁剪光标都会关闭,即maxDocs=1。为了让它无限期地开放,你应该忽略这个限制。

使用等待数据。只有在明确关闭RM时才会调用onComplete

您需要使用一些来自光标的流功能,例如。枚举并处理每个新步骤/结果。看见https://github.com/sgodbillon/reactivemongo-tailablecursor-demo/

 类似资料:
  • 我们目前正在探索MongoDB中的上限集合和可跟踪游标,以创建通知排队系统。然而,在创建了一个简单的LinqPad测试(代码如下)后,我们在运行时注意到,Mongo不断分配内存,直到没有更多的可用资源,即使我们没有插入任何记录。这种分配一直持续到所有系统RAM被使用,此时Mongo简单地停止响应。 由于我们还不熟悉封顶系列和可定制游标,所以我想确保在提交bug之前,我们没有错过任何明显的东西。 注

  • 我有50多个需要裁剪的光栅文件(ASCII格式)。我已经以ASCII格式从ArcMap导出了遮罩,并将其加载到R中。如何使其适用于一行中的所有光栅,并以与之前相同的名称导出它们(当然是在不同的文件夹中,以避免覆盖)? 我知道光栅软件包中有裁剪功能,但到目前为止我从未使用过。我只是把它们堆放起来做进一步的栖息地分析。 到目前为止,我的代码:

  • 我想从MongoDB集合中获取最后5个文档,然后继续跟踪它以获取新文档。这可以通过一个查询完成,还是我真的需要两个查询?如果有两个查询,在不添加额外字段的情况下实现这一点的最佳方法是什么? 虽然任何语言的答案都可以,但下面是一个示例节点。我试图实现的js代码片段(省略错误处理,并根据问题的第一个答案编辑代码片段): 问题:上面的代码从第一个文档开始打印所有文档,然后等待更多文档。选项和无效。 问题

  • 问题内容: 我正在尝试裁剪图像,然后将裁剪后的图像粘贴到另一个图像的中心。理想情况下,我希望裁切后的图像小于粘贴的图像,以便在粘贴的图像周围有一个边框,但我不知道这样是否可行。 这是我尝试过的方法(以及由此产生的错误消息): 我可以看到“区域”的大小已设为(0,0),但我不明白为什么。 任何对此的帮助将非常感谢 问题答案: 裁剪方法的PIL文档指出: 返回当前图像的矩形区域。该框是一个四元组,定义

  • 我试图在从图库中选择图像后使用intent来裁剪图像。以下是我的代码片段 在这里,我使用PICK_IMAGE_REQUEST意图句柄调用上面的代码段 由于我在裁剪后使用了相同的意图,即PICK_IMAGE_REQUEST,可能会出现什么问题

  • 本文向大家介绍iOS实现裁剪框和图片剪裁功能,包括了iOS实现裁剪框和图片剪裁功能的使用技巧和注意事项,需要的朋友参考一下 图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本身不难,主要剪裁框封装发了点时间,主要功能可以拖动四个角缩放,但不能超出父视图,拖动四个边单方向缩放,不能超出父视图,拖动中间部分单单移动,不改变大小,不能超出父