Сбор полей документа в массив из БД Mongo в Scala - PullRequest
0 голосов
/ 25 февраля 2019

Итак, у меня есть коллекция новостных статей, оцененных по просмотрам страниц из БД Mongo, которые я запрашиваю следующим образом:

// To directly connect to the default server localhost on port 27017
val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017/")
val database: MongoDatabase = mongoClient.getDatabase("Posts")
var collection: MongoCollection[Document] = database.getCollection("news")

collection.find(equal("id","id123")).limit(5).subscribe((doc: Document)=>println(s"${doc.get("views")}"))

Это печатает:

Some(BsonInt32{value=66043})
Some(BsonInt32{value=66306})
Some(BsonInt32{value=66336})
Some(BsonInt32{value=66365})
Some(BsonInt32{value=66384})

Так что теперь я хочусобрать все эти значения в массив, который я пытался сделать с помощью этой строки кода:

var scores = collection.find(equal("id","id123")).limit(5).subscribe((doc: Document)=>doc.get("score").map(_.asInt32().getValue).collect())

Но .collect() не работает.

Как лучше всего превратить поле Монго в массив Ints?

1 Ответ

0 голосов
/ 01 марта 2019

Я нашел решение, хотя и не до конца его понимаю:

import org.mongodb.scala._
import org.mongodb.scala.model.Filters._
import org.mongodb.scala.model.Projections._

object main extends App {
  //Connect to Mongo Client and DB
  val mongoClient: MongoClient = MongoClient("mongodb://localhost:27017/")
  val database: MongoDatabase = mongoClient.getDatabase("MyDatabase")

  //Get Collection
  val collection: MongoCollection[Document] = database.getCollection("collectionName")

  //Returns the object with specified fields in projection 
  //as a Future observable containing MongoDB Documents
  val collScores = collection.find(equal("id","id123")).limit(5).projection(fields(include("id", "score", "time"), excludeId()))

  //Maps the document fields to tuples and converts them 
  //to non BSon values since they are easier to work with 
  //than future observables.
  val listMapScores = collScores.map(doc=>(doc("id").asString.getValue,doc("score").asInt32.getValue,doc("time").asDouble.getValue)).collect().results().head 

}

Я не уверен, почему вам нужно сделать как results(), так и head в последней строке.Если вы не берете head, вы получаете Seq[Seq(String,Int)]].Из того, что я могу сказать, будущая наблюдаемая содержит те же значения независимо от того, берете ли вы в ряд head или Nth.

...