2016-02-23 6 views
0

я использую Scala и Mongoldb-Casbah и я получаю некоторые данные:Mongoldb-Касба: получить первый матч в коллекции

val myData: Traversable[Imports.DBObject] = myCollection.find(query).toTraversable 

Данные, возвращаемые представляют собой коллекцию, как это:

[ {_id: "...", цены: [ {myValue: "...", ...}, {myValue: "...", ...}, ... ] } , {... }, ... ]

Что мне нужно, это первый не пустой myValue.

Я пробовал разные вещи, как:

myData.foldLeft(List[Any]()) { (acc, v) => 
     acC++ v.get("prices").asInstanceOf[BasicDBList].filter(_.asInstanceOf[DBObject].getOrElse("myValue", "").toString.nonEmpty).take(1) 
    } 

но не возвращает одно единственное значение, если я не сделать его еще более сложным. Я не пробовал findMap или collectFirst еще tho.

Любая идея, как извлечь один из myValue с этими данными?

ответ

0

Например, если у вас есть документы, как показано ниже:

{ 
    "_id": ObjectId(...), 
    "item": "A", 
    "prices": [ {},{"myValue": 1}, {"myValue": 4}, {} ] 
}, 
{ 
    "_id": ObjectId(...), 
    "item": "B", 
    "prices": [ {"myValue": 7}, {}, {"myValue": 9}, {} ] 
} 

Если вы хотите, чтобы извлечь один единственный myValue элемент, который не пуст, вы могли бы использовать $elemMatch оператор проектирования. Оператор $elemMatch ограничивает содержимое поля массива из результатов запроса только содержащим только элементом, соответствующим состоянию $elemMatch.

В качестве примера, чтобы сделать это в/касбе лестницы:

val coll = MongoClient()("dbName")("collName") 

/* The query below is equivalent to db mongo shell 
    db.collName.find({item:"A"}, {prices: { $elemMatch: { myValue: {$exists:true} } } }) */ 

val elemMatch = "prices" $elemMatch MongoDBObject("myValue"-> MongoDBObject("$exists" -> true)) 
val query = MongoDBObject("item" -> "A") 

coll.find(query, elemMatch).foreach { doc => 
    println(doc) 
} 
// Output: { "_id" : { "$oid" : "..."} , "prices" : [ { "myValue" : 1.0} ] } 

Выше был испытан с: MongoDB v3.2, Скала v2.11.7, Casbah v3.1.0.

 Смежные вопросы

  • Нет связанных вопросов^_^