【问题标题】:ReactiveMongo: How to use projectionReactiveMongo:如何使用投影
【发布时间】:2014-02-21 18:28:53
【问题描述】:

在使用 ReactiveMongo 从 MongoDB 查询文档时,我试图过滤掉 password 字段:

val projection = Json.obj("password" -> 0)

def find(selector: JsValue, projection: Option[JsValue]) = {
  val query = collection.genericQueryBuilder.query(selector)
  projection.map(query.projection(_))
  query.cursor[JsValue].collect[Vector](perPage).transform(
    success => success,
    failure => failure match {
      case e: LastError => DaoException(e.message, Some(DATABASE_ERROR))
    }
  )
}

上面的代码没有效果......我也得到了password字段。如果我从 mongo 客户端尝试以下操作,那么它可以工作并且不会返回 password

db.users.find( { username: 'j3d' }, { password:0} )

我错过了什么吗?

【问题讨论】:

    标签: json mongodb scala reactivemongo


    【解决方案1】:

    解决办法如下:

    def find(selector: JsValue, projection: Option[JsValue]) = {
      var query = collection.genericQueryBuilder.query(selector)
      projection.map(query = query.projection(_))
    
      query.cursor[JsValue].collect[Vector](perPage).transform(
        success => success,
        failure => failure match {
          case e: LastError => DaoException(e.message, Some(DATABASE_ERROR))
        }
      )
    }
    

    或者:

    def find(selector: JsValue, projection: Option[JsValue]) = {
      val query = collection.genericQueryBuilder
        .query(selector)
        .projection(projection.getOrElse(Json.obj())
    
      query.cursor[JsValue].collect[Vector](perPage).transform(
        success => success,
        failure => failure match {
          case e: LastError => DaoException(e.message, Some(DATABASE_ERROR))
        }
      )
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多