1

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

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

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

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

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”值。如果它总是下载整个文档,请澄清是否值得指定我感兴趣的字段。

谢谢。

4

1 回答 1

0

根据消息来源,reactivemongo 似乎不支持它。所以我创建了一个快速助手:

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
}

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

于 2013-09-10T02:09:12.150 回答