2013-09-09 2 views
1

У меня есть 1 проблема и 1 вопрос при использовании BSONDocument getAs.BSONDocument.getAs issue

Всякий раз, когда я пытаюсь получить доступ к значению л в формате ниже, вызвав этим:

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

он возвращает None. Однако если я это сделаю:

docFound.getAs[BSONDocument]("v") 

он returtns действительный BSONDocument для всего раздела v. Что не так в моем первом звонке? Поддерживает ли поиск пути?

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

Второй вопрос: я найти документ в БД с помощью следующего фильтра:

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

Но, похоже, вместо того, чтобы извлекать только эти значения «_id» & «л» он извлекает весь документ. Когда я делаю BSONDocument.pretty (foundDoc), я вижу весь документ, а не только значение «l», которое я запросил. Просьба уточнить, стоит ли даже указывать поля, которые меня интересуют, если он всегда загружает весь документ.

Спасибо.

+0

Думаю, вы не должны использовать пунктирные ключи (как в '1.0'). –

+0

Они поддерживаются MongoDB, поэтому я полагаю, что я свободен в использовании. Однако я понимаю, что в идеале я не должен вмешиваться в вложенное структурирование. –

ответ

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 
} 

Однако мой второй вопрос по-прежнему действует. Если кто-то знает, пожалуйста, дайте мне знать.

+0

Вы правы, он еще не существует в ReactiveMongo. На самом деле это может быть интересная функция. –

+0

Вы можете использовать мой фрагмент кода :) Я нахожу, что библиотека очень интересна и интересна, поэтому рада внести свой вклад. –