MongoDB Scala-查询特定字段值的文档
所以我知道在Mongo Shell中,您可以使用点符号来获取任何文档中所需的字段 点表示法是如何在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) 编辑: 我正试图研究一种机制,基本上在消费者关闭时重新消费卡夫卡记录。为此,我将我的卡夫卡记录存储在一个外部数据库中,然后尝
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时,解决了这个问题。这很奇怪,好吧,我会的。我还有一个问题。如果我想按降序排序以获得具有最大偏移量值的记录,该怎么办。我该如何包括这些?排序和预测似乎并不完全混合。。