Как сохранить результат collection.find в массив - PullRequest
1 голос
/ 31 марта 2020
object ConnHelper extends Serializable{
  lazy val jedis = new Jedis("localhost")
  lazy val mongoClient = MongoClient("mongodb://localhost:27017/recommender")
}
val ratingCollection = ConnHelper.mongoClient.getDatabase(mongoConfig.db).getCollection(MONGODB_RATING_COLLECTION)
val Existratings: Observable[Option[BsonValue]] = ratingCollection
    .find(equal("userId",1234))
    .map{
    item => item.get("productId")
    }

Документы похожи на эти

{
  "id":****,
  "userId":4567,
  "productId":12345,
  "score":5.0
}

Я использую Scala и Пн go - Scala -драйвер 2.9.0 для подключения MongoDB и поиска документов, где "userId" поле равное 1234, тогда я хочу сохранить значение «productId» документов в массив, но возвращаемое значение имеет наблюдаемый тип. Может кто-нибудь сказать, как сохранить результат запроса в массив? Я был бы очень признателен.

Ответы [ 3 ]

1 голос
/ 02 апреля 2020

Пожалуйста, попробуйте метод, который использует структуру Обещание / Будущее , чтобы найти последовательность документов, которые соответствуют критериям поиска. Например:

import org.mongodb.scala.bson._
def find (search_key: String, search_value: String, collection_name: String): Seq[Document] = {

    // The application will need to wait for the find operation thread to complete
    // in order to process the returned value.

    log.debug(s"Starting database find_all operation thread")

    // Set up new client connection, database, and collection
    val _client: MongoClient = MongoClient(config_client)
    val _database: MongoDatabase = _client.getDatabase(config_database)
    val collection: MongoCollection[Document] = _database.getCollection(collection_name)

    // Set up result sequence
    var result_seq : Seq[Document] = Seq.empty

    // Set up Promise container to wait for the database operation to complete
    val promise = Promise[Boolean]

    // Start insert operation thread; once the thread has finished, read resulting documents.
    collection.find(equal(search_key, search_value)).collect().subscribe((results: Seq[Document]) => {
      log.trace(s"Found operation thread completed")
      // Append found documents to the results
      result_seq = result_seq ++ results
      log.trace(s" Result sequence: $result_seq")

      promise.success(true) // set Promise container
      _client.close // close client connection to avoid memory leaks
     })


    val future = promise.future // Promise completion result
    Await.result(future, Duration.Inf) // wait for the promise completion result

    // Return document sequence
    result_seq

  }

Затем вы можете перебрать последовательность документов и перетащить продукты в Список (лучше, чем Массив).

def read : List[String] = {

    val document_seq = Database.find("userID","1234",collection)

    // Set up an empty return map
    val return_map : mutable.Map[String, String] = mutable.Map.empty

    // Translate data from each document into Product object
    document_seq.foreach(_document => {
      return_map.put(
         _document("id").asString.getValue,
         _document("productId").asString.getValue
        )

    })

    // Convert values to list map and return
    return_map.values.toList
  }

Добро пожаловать использовать пример утилиты базы данных с нашей веб-страницы LineDrop:

https://code.linedrop.io/guides/Ultimate-Guide-to-Building-a-Web-Application-with-Play-and-Scala/Utilities#DatabaseIntegration

В руководстве есть ссылка на код на GitHub.

0 голосов
/ 31 марта 2020

Драйвер Mon go Scala использует модель Observable , которая состоит из трех частей.

Вам необходимо подписать наблюдателя на наблюдаемое. Взгляните на примеров .

Самое быстрое решение - это совместить вызов toFuture:

val Existratings =
      ratingCollection
      .find(equal("userId",1234))
      .map{
        item => item.get("productId")
      }.toFuture()

, который вернет Sep BsonValues ​​с набором результатов

0 голосов
/ 31 марта 2020

это может быть:

val productIds = ratingCollection
    .find(equal("userId",1234))
    .map { _.get("productId") }
    .toArray
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...