MongoDB使用Gridfs在用户集合中保存图像

时间:2015-01-19 12:53:04

标签: mongodb scala collections playframework gridfs

目前我正在使用Scala开发一个带有Play 2 Framework的后端服务器。 我有以下问题:

我使用File Handler GridFS在MongoDB中保存图像等文档。 GridFs创建了两个文件:

fs.files,包含元数据和 fs.chunks,存储块

但我想将图像保存在我自己的收藏中。所有图像都应该有一个数据库条目,如用户名和注释。 我有两个想法如何解决问题,但我需要帮助。

解决方案#1:

使用我自己的收藏品:

{
   username: String
   comments: Array<String>
   image   : Gridfs 
}

如何使用GridFS在我自己的集合中获取图像?有可能吗?

解决方案#2:

我使用fs.files集合,其中包含元数据并添加条目用户名和注释。我试过了,但它不起作用。

谁可以帮助我?

由于

1 个答案:

答案 0 :(得分:0)

至于解决方案#1

如果您使用的是ReactiveMongo,则会有一个示例项目,其中包含复合服务器响应,包含文件和json

https://github.com/sgodbillon/reactivemongo-demo-app/blob/master/app/controllers/Application.scala

 def showEditForm(id: String) = Action.async {
    val objectId = new BSONObjectID(id)
    // get the documents having this id (there will be 0 or 1 result)
    val futureArticle = collection.find(BSONDocument("_id" -> objectId)).one[Article]
    // ... so we get optionally the matching article, if any
    // let's use for-comprehensions to compose futures (see http://doc.akka.io/docs/akka/2.0.3/scala/futures.html#For_Comprehensions for more information)
    for {
      // get a future option of article
      maybeArticle <- futureArticle
      // if there is some article, return a future of result with the article and its attachments
      result <- maybeArticle.map { article =>
        import reactivemongo.api.gridfs.Implicits.DefaultReadFileReader
        // search for the matching attachments
        // find(...).toList returns a future list of documents (here, a future list of ReadFileEntry)
        gridFS.find(BSONDocument("article" -> article.id.get)).collect[List]().map { files =>
          val filesWithId = files.map { file =>
            file.id.asInstanceOf[BSONObjectID].stringify -> file
          }
          Ok(views.html.editArticle(Some(id), Article.form.fill(article), Some(filesWithId)))
        }
      }.getOrElse(Future(NotFound))
    } yield result
  }

您可以将其用作参考实现。

至于解决方案#2

您应该能够在DefaultFileToSave.metadata中存储其他数据,然后使用{&#34; metadata.user&#34;来查询mongo。 :&#34;用户&#34;}(查看Query on MongoDB GridFS metadata (Java)

另一种解决方案

保留档案&amp;您的元信息作为独立实体,并独立管理它们,将来扩展它们会更容易。

对于GridFS上传功能(https://github.com/ReactiveMongo/Play-ReactiveMongo

def upload = Action(gridFSBodyParser(gridFS)) { request =>
  // here is the future file!
  val futureFile: Future[ReadFile[BSONValue]] = request.body.files.head.ref
  futureFile.map { file =>
    // do something
    Ok
  }.recover {
    case e: Throwable => InternalServerError(e.getMessage)
  }
}

要扩展以前的,就端点而言,作为示例

  • / video /:id / file - 您的GridFS文件端点
  • / video /:id / meta - 您的元信息端点(您需要的是什么)
  • / video /:id(可选) - 合并文件&amp;元回应。