从集合中获取结果时删除MongoDB对象ID

时间:2016-07-04 21:59:36

标签: mongodb scala playframework reactivemongo

我在Play Framework App中使用reactivemongo,我发现所有文档都代表

{name: "Robert", age: 41 }

的形式存储在MongoDB中
{_id: { $oid:"574005977e356b7310bcdc8d"}, name: "Robert", age: 41 }

那没关系。这是我用来保存文件的方法

// Scala code
def save(document: JsObject)
        (implicit ec: ExecutionContext): Future[WriteResult] = {
  collection.insert(document)
}

后一种表示也是我使用这种方法从DB中获取同一文档时得到的:

def find(query: JsObject, queryOptions: QueryOpts, projection: JsObject, 
          sort: JsObject, pageSize: Int)
 (implicit ec: ExecutionContext): Future[List[JsObject]] = {
  collection.find(query, projection)
    .options(queryOptions)
    .sort(sort)
    .cursor[JsObject](ReadPreference.primaryPreferred)
    .collect[List](pageSize)
  }

但在这种情况下,我想得到像

这样的表达方式
{_id: "574005977e356b7310bcdc8d", name: "Robert", age: 41 }

通过我的ReSTful API将文档发送到请求客户端。我怎么能得到这个?

2 个答案:

答案 0 :(得分:0)

您可以使用Json transformersCase 6: Prune a branch from input JSON

...
.collect[List](pageSize)
.map(JsArray)
.map(
  _.transform(
    Reads.list(
      (__\"_id").json.prune
    )
  )
)
... tranform JsResult to your needs

答案 1 :(得分:0)

首先让我说下面的表示不是存储在使用BSON的MongoDB中的内容,而是使用JSON扩展语法序列化的内容(参见JSON documentation for ReactiveMongo)。

然后,在查询构建中使用.cursor[T]时,您可以自由地提供自定义文档阅读器(在隐式范围内)。 使用JSON序列化包时,这意味着提供适当的Reads[T]

我还要补充一点,函数.find.save基本上是ReactiveMongo Collection API已经完成的。