我目前正在尝试从 monogDb 获取数据,然后使用该数据执行聚合查询。我不确定我是否正确地完成了此操作,但这是迄今为止的代码。但是当我按下按钮时,应用程序崩溃了,并且出现以下错误,如下所示。知道为什么/有什么解决方案吗?感谢您的帮助!
错误:
2023-12-17 17:10:57.338 1082-1715 OneSearchS...stProvider com...le.android.apps.nexuslauncher E Failed to fetch suggestions from AppSearch, fallback to AGA
java.util.concurrent.CompletionException: java.util.NoSuchElementException: No value present
at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:308)
at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:323)
at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:684)
at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:486)
at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2138)
at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:59)
at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)
atandroid.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)
atandroid.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)
at android.os.Handler.handleCallback(Handler.java:958)
atandroid.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: java.util.NoSuchElementException: No value present
at java.util.Optional.get(Optional.java:144)
at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:16)
at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)
at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)
at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.os.HandlerThread.run(HandlerThread.java:67)
获取MongoClient:
@SuppressLint("AuthLeak")
fun getMongoClient(): MongoClient {
return MongoClients.create("My String goes here -> taken from mongodb")
}
从MongoDb获取数据:
fun fetchDataFromMongoDB(collection: MongoCollection<Document>): List<Document> {
// Define your aggregation pipeline stages here
val pipeline = listOf(
Aggregates.match(Filters.eq("age", "20")),
// Add more pipeline stages as needed
)
// Execute the aggregation pipeline
val result = collection.aggregate(pipeline)
// Convert the result to a list of documents
val documents = mutableListOf<Document>()
try {
// Code that might be causing the exception
result.forEach { document ->
documents.add(document)
println("Pinged your deployment. You successfully connected to MongoDB!")
}
} catch (e: Exception) {
e.printStackTrace()
}
return documents
}
主要MongoDb:
@Composable
fun MainMongoData() {
var fetchedData by remember { mutableStateOf("") }
Column {
// Display your fetched data in a TextField
TextField(
value = fetchedData,
onValueChange = { /* No-op for read-only TextField */ },
label = { Text("Fetched Data") },
readOnly = true,
modifier = Modifier.fillMaxWidth()
)
// Button to trigger search
Button(onClick = {
val client = getMongoClient()
val database = client.getDatabase("people")
val collection = database.getCollection("person")
val documents = fetchDataFromMongoDB(collection)
// Concatenate document JSON strings and update the TextField
fetchedData = documents.joinToString("\n") { it.toJson() }
client.close()
}) {
Text("Search")
}
}
}
Kotlin
可选值由nullable
类型表示,可以是null or non-nul
l。要访问 nullable
类型的值,可以使用 safe call operator
(?.)、elvis operator
(?:) 或 not-null assertion operator (!!)
。您还可以使用 方法 getOrNull(), getOrElse(), or getOrDefault()
将 Optional<T>
映射到 nullable type34.
听起来好像您正在尝试访问在 fetch 函数中没有值的Optional 的值,导致抛出
NoSuchElementException
。为了避免这种情况,如果Optional为空,您可以使用上面提到的方法之一来优雅地处理null情况,也称为getOrNull()
到return null
,然后在使用值之前检查是否为null:
val result = collection.find().first().getOrNull() if (result != null) { // do something with result } else { // handle null case }
另一个可能的问题 - 您使用
forEach()
来迭代流集合的元素。 要迭代流的元素,请使用 collect()
方法,该方法将 suspending lambda
作为操作。 forEach()
不可用于flows,因为它意味着同步和幂等操作,而flows256则不是这种情况。也请阅读此