尝试从 MongoDb 获取数据时出错

问题描述 投票:0回答:1

我目前正在尝试从 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")
        }
    }
}
mongodb kotlin runtime-error
1个回答
0
投票

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则不是这种情况。也请阅读

© www.soinside.com 2019 - 2024. All rights reserved.