BSONDocument.getAs问题

时间:2013-09-09 15:23:12

标签: mongodb scala reactivemongo

使用BSONDocument getAs时有1个问题和1个问题。

每当我尝试通过调用以下格式访问以下格式的值l时:

docFound.getAs[Int]("v.1.0.2013.9.9.l") 

它返回None。但是,如果我这样做:

docFound.getAs[BSONDocument]("v") 

它为整个v部分重新发送有效的BSONDocument。我第一次打电话有什么问题? reactivemongo是否支持路径遍历?

BSONDocument: {
  v: {
    1.0: {
      2013: {
        9: {
          9: {
            l: BSONInteger(0),
            s: BSONInteger(8)
          }
        }
      }
    }
  }
}

第二个问题是: 我在DB中找到了一个带有以下过滤器的文档:

BSONDocument(
"_id" -> 0,
"v.1.0.2013.9.9.l" -> 1)

但似乎不是仅提取这些值“_id”& “l”它提取整个文件。当我做BSONDocument.pretty(foundDoc)时,我看到了整个文档,而不仅仅是我要求的“l”值。如果它总是下载整个文档,请澄清是否值得指定我感兴趣的字段。

感谢。

1 个答案:

答案 0 :(得分:0)

似乎根据消息来源,反应动作不支持。所以我创建了一个快速帮手:

def getAsByPath[T](path: String, doc: BSONDocument)
       (implicit reader: BSONReader[_ <: BSONValue, T]): Option[T] = {
  val pathChunks = path.split('.')
  var pathIndex = 0
  var curDoc: Option[BSONDocument] = Some(doc)
  var currentChunk = ""

  while(pathIndex != pathChunks.size) {
    currentChunk += pathChunks(pathIndex)

    // If this is the last chunk it must be a value
    // and if previous Doc is valid let's get it
    if (pathIndex == pathChunks.size - 1 && curDoc != None)
      return curDoc.get.getAs[T](currentChunk)

    val tmpDoc = curDoc.get.getAs[BSONDocument](currentChunk)
    if (tmpDoc != None) {
      currentChunk = ""
      curDoc = tmpDoc
    } else {
      // We need to support this as sometimes doc ID 
      // contain dots, for example "1.0"
      currentChunk += "."
    }

    pathIndex += 1
  }

  None
}

然而我的第二个问题仍然有效。如果有人知道,请告诉我。