使用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”值。如果它总是下载整个文档,请澄清是否值得指定我感兴趣的字段。
感谢。
答案 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
}
然而我的第二个问题仍然有效。如果有人知道,请告诉我。