MongoDB Scala-查询特定字段值的文档

MongoDB Scala-查询特定字段值的文档,mongodb,scala,mongo-java-driver,Mongodb,Scala,Mongo Java Driver,所以我知道在Mongo Shell中,您可以使用点符号来获取任何文档中所需的字段 点表示法是如何在MongoDB Scala中实现的。我对它的工作原理感到困惑。以下是从集合中获取文档的代码: val record = collection.find().projection(fields(include("offset"), excludeId())).limit(1) 编辑: 我正试图研究一种机制,基本上在消费者关闭时重新消费卡夫卡记录。为此,我将我的卡夫卡记录存储在一个外部数据库中,然后尝

所以我知道在Mongo Shell中,您可以使用点符号来获取任何文档中所需的字段

点表示法是如何在MongoDB Scala中实现的。我对它的工作原理感到困惑。以下是从集合中获取文档的代码:

val record = collection.find().projection(fields(include("offset"), excludeId())).limit(1)
编辑:

我正试图研究一种机制,基本上在消费者关闭时重新消费卡夫卡记录。为此,我将我的卡夫卡记录存储在一个外部数据库中,然后尝试从那里获取最新的偏移量,并从该点开始使用。下面是我的Scala方法,它可以做到这一点:

def getLatestCommitOffsetFromDB(collectionName: String): Long = {

import com.mongodb.Block
import org.bson.Document

val printBlock = new Block[Document]() {
  override def apply(document: Document): Unit = {
    println(document.toJson)
  }
}

import com.mongodb.async.SingleResultCallback
val callbackWhenFinished = new SingleResultCallback[Void]() {
  override def onResult(result: Void, t: Throwable): Unit = {
    System.out.println("Latest offset fetched from database.")
  }
}

var obj: String = " "

try {

  val record = collection.find().projection(fields(include("offset"), excludeId())).limit(1)
  //TODO FIND A WAY TO GET THE VALUE AND STORE IT IN A VARIABLE

} catch {
  case e: RuntimeException =>
    logger.error(s"MongoDB Server Error : Unable to fetch data from collection : $collection")
    logger.error(e.printStackTrace().toString())
}

obj.toLong

}
问题不在于我可以从Mongo获取文档,更重要的是,我试图访问Mongo中的特定字段。文档中有四个字段:主题、分区、消息和偏移量。我想得到“offset”字段并将其存储在一个变量中,这样我就可以使用它作为重新使用Kafka记录的重新启动点

从那里我该去哪里

POM.xml

<?xml version="1.0" encoding="UTF-8"?>

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>OffsetManagementPoC</groupId>
<artifactId>OffsetManagementPoC</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-clients</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka_2.12</artifactId>
        <version>1.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler</artifactId>
        <version>2.11.8</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.apache.kafka</groupId>
        <artifactId>kafka-streams</artifactId>
        <version>0.10.0.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-streaming-kafka-0-10 -->
    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-streaming-kafka-0-10_2.11</artifactId>
        <version>2.2.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.6.5</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.6.5</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.6.5</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>casbah_2.12</artifactId>
        <version>3.1.1</version>
        <type>pom</type>
    </dependency>
    <dependency>
        <groupId>com.typesafe</groupId>
        <artifactId>config</artifactId>
        <version>1.2.1</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb.scala</groupId>
        <artifactId>mongo-scala-driver_2.12</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-compiler</artifactId>
        <version>2.11.8</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb.scala</groupId>
        <artifactId>mongo-scala-driver_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>bson</artifactId>
        <version>3.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver-async</artifactId>
        <version>3.4.3</version>
    </dependency>
    <dependency>
        <groupId>org.mongodb.scala</groupId>
        <artifactId>mongo-scala-bson_2.11</artifactId>
        <version>2.1.0</version>
    </dependency>
</dependencies>
OffsetManagementPoC
抵销管理
1.0-快照
org.apache.kafka
卡夫卡客户
1.0.0
org.apache.kafka
卡夫卡2.12
1.0.0
org.scala-lang
scala编译器
2.11.8
org.slf4j
slf4j api
1.7.25
org.apache.kafka
卡夫卡河
0.10.0.1
org.apache.spark
spark-U 2.11
2.2.0
org.apache.spark
spark-streaming-kafka-0-10_2.11
2.2.0
org.apache.spark
spark-streaming-kafka-0-10_2.11
2.2.0
com.fasterxml.jackson.core
杰克逊核心
2.6.5
com.fasterxml.jackson.core
杰克逊数据绑定
2.6.5
com.fasterxml.jackson.core
杰克逊注释
2.6.5
org.mongodb
卡斯巴2.12
3.1.1
聚甲醛
com.typesafe
配置
1.2.1
org.mongodb.scala
mongo-scala-driver_2.12
2.1.0
org.scala-lang
scala编译器
2.11.8
org.mongodb
mongo java驱动程序
3.4.2
org.mongodb.scala
mongo-scala-driver_2.11
2.1.0
org.mongodb
布森
3.3.0
org.mongodb
mongodb驱动程序异步
3.4.3
org.mongodb.scala
mongo-scala-bson_2.11
2.1.0

根据文档,接受
com.mongodb.DBObject

您可以使用该接口的一个实现,它基本上类似于
mutable.Map[String,Object]
。您可以使用接受以下映射的构造函数:

val query = new com.mongodb.BasicDBObject(Map(
  "foo.bar" -> "value1"
  "bar.foo" -> "value2"
))
val record = collection.find(query)....

您可以通过以下方式修改查询:

import com.mongodb.MongoClient
import com.mongodb.client.MongoCollection
import com.mongodb.client.model.Projections

def getLatestCommitOffsetFromDB(
  databaseName: String,
  collectionName: String
): Long = {

  val mongoClient = new MongoClient("localhost", 27017);

  val collection =
    mongoClient.getDatabase(databaseName).getCollection(collectionName)

  val record = collection
    .find()
    .projection(
      Projections
        .fields(Projections.include("offset"), Projections.excludeId()))
    .first

  record.get("offset").asInstanceOf[Double].toLong
}
我认为您丢失了
com.mongodb.client.model.Projections
导入,以便使用
字段
包含
排除ID

我使用了
first
而不是
limit(1)
来更容易地提取结果

first
返回一个
文档
对象,您可以在该对象上调用
get
来检索请求字段的值

但事实上,由于您只需要一条记录和一个字段,因此可以删除投影!:

val record = collection.find().first

请提供输入和输出示例。您能告诉我们您提供的代码应该在哪个上下文中工作吗?@XavierGuihot我编辑了这篇文章来解释一下上下文;如果您还需要什么,请告诉我。这不是解析record.get,因为某些原因,当我调用“first”时“它请求SingleResultCallBack函数。功能简单;但它仍然无法解析get。它不解析record.get(哪个异常)的原因是什么?你的驱动程序版本是什么?也不例外。我在IntelliJ上,鼠标悬停在get上,上面写着“无法解析符号get”。我将我的POM文件添加到帖子中以供参考。也许这会让事情变得更清楚。不管怎样,我知道了。我最初使用MongoClient创建我的MongoClient,当我切换到您使用的MongoClient时,解决了这个问题。这很奇怪,好吧,我会的。我还有一个问题。如果我想按降序排序以获得具有最大偏移量值的记录,该怎么办。我该如何包括这些?排序和预测似乎并不完全混合。。