Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 使用Mongo Scala驱动程序宏读取包含其他嵌套字段的文档_Mongodb_Scala_Mongo Scala Driver - Fatal编程技术网

Mongodb 使用Mongo Scala驱动程序宏读取包含其他嵌套字段的文档

Mongodb 使用Mongo Scala驱动程序宏读取包含其他嵌套字段的文档,mongodb,scala,mongo-scala-driver,Mongodb,Scala,Mongo Scala Driver,是否可以使用从mongo db读取文档,其中包含案例类中指定字段的附加字段 我希望在反序列化时忽略案例类中未指定但文档中未指定的字段。但是会抛出一个异常。由于mongo db的无模式方法,不可能在case类中指定字段的总集合 我要反序列化的文档如下所示: { "_id": 6, "nestedOne": { "nestedOneOne": 123, "nestedOneTwo": 456 }, "nestedTwo": {

是否可以使用从mongo db读取文档,其中包含案例类中指定字段的附加字段

我希望在反序列化时忽略案例类中未指定但文档中未指定的字段。但是会抛出一个异常。由于mongo db的无模式方法,不可能在case类中指定字段的总集合

我要反序列化的文档如下所示:

{
    "_id": 6,
    "nestedOne": {
        "nestedOneOne": 123,
        "nestedOneTwo": 456
    },
    "nestedTwo": {
        "nestedTwoOne": 789
    }
}
我希望下面的示例能够起作用:

import org.bson.codecs.configuration.CodecRegistries.{fromProviders, fromRegistries}
import org.bson.codecs.configuration.CodecRegistry
import org.mongodb.scala.bson.codecs.DEFAULT_CODEC_REGISTRY
import org.mongodb.scala.bson.codecs.Macros._
import org.mongodb.scala.model.Filters
import org.mongodb.scala.MongoClient
import org.mongodb.scala.bson.collection.immutable.Document
import scala.concurrent.Await

import scala.concurrent.duration._

// prepare the case classes and register them
case class TestDocument(_id: Int, nestedOne: Option[NestedOne])
case class NestedOne(nestedOneOne: Int, nestedOneTwo: Int)
val testCodecRegistry: CodecRegistry = fromRegistries(
  fromProviders(classOf[TestDocument], classOf[NestedOne]),
  DEFAULT_CODEC_REGISTRY
)

// prepare the test data & insert them
val testDocument = Document(
  "_id" -> 6,
  "nestedOne" -> Document("nestedOneOne" -> 123, "nestedOneTwo" -> 456),
  "nestedTwo" -> Document("nestedTwoOne" -> 789)
)

val mongoClient = MongoClient("mongodb://localhost:1234")
val database = mongoClient.getDatabase("testdatabase")
val testCollection = database.getCollection("test_collection").withCodecRegistry(testCodecRegistry)
Await.result(testCollection.insertOne(testDocument).toFuture, 2.minutes)

// try to read and deserialize the document again
val _ = Await.result(testCollection.find[TestDocument](Filters.equal("_id", 6)).toFuture(), 2.minutes)
但会引发以下异常:

head of empty list
java.util.NoSuchElementException: head of empty list
    at scala.collection.immutable.Nil$.head(List.scala:428)
    at scala.collection.immutable.Nil$.head(List.scala:425)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readDocument(MacroCodec.scala:204)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readDocument$(MacroCodec.scala:193)
    at de.peterschrott.mongotest.MongoTest$$anon$1$TestDocumentMacroCodec$3.readDocument(MongoTest.scala:29)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue(MacroCodec.scala:173)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readValue$(MacroCodec.scala:169)
    at de.peterschrott.mongotest.MongoTest$$anon$1$TestDocumentMacroCodec$3.readValue(MongoTest.scala:29)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.decode(MacroCodec.scala:104)
    at org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.decode$(MacroCodec.scala:96)
    at de.peterschrott.mongotest.MongoTest$$anon$1$TestDocumentMacroCodec$3.decode(MongoTest.scala:29)
    at com.mongodb.operation.CommandResultArrayCodec.decode(CommandResultArrayCodec.java:52)
    at com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:53)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
    at org.bson.codecs.configuration.LazyCodec.decode(LazyCodec.java:47)
    at org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
    at com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:56)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
    at org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
    at com.mongodb.connection.ReplyMessage.<init>(ReplyMessage.java:57)
    at com.mongodb.connection.CommandProtocol.getResponseDocument(CommandProtocol.java:139)
    at com.mongodb.connection.CommandProtocol.access$000(CommandProtocol.java:51)
    at com.mongodb.connection.CommandProtocol$CommandResultCallback.callCallback(CommandProtocol.java:271)
    at com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:48)
    at com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:23)
    at com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:470)
    at com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:464)
    at com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:119)
    at com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:115)
    at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
    at com.mongodb.connection.InternalStreamConnection.executeCallbackAndReceiveResponse(InternalStreamConnection.java:378)
    at com.mongodb.connection.InternalStreamConnection.access$1700(InternalStreamConnection.java:66)
    at com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:420)
    at com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:389)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onSuccess(InternalStreamConnection.java:562)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.access$2200(InternalStreamConnection.java:517)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:584)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:568)
    at com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:447)
    at com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:444)
    at com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:218)
    at com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:201)
    at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
    at sun.nio.ch.Invoker.invokeDirect(Invoker.java:157)
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.implRead(UnixAsynchronousSocketChannelImpl.java:553)
    at sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:276)
    at sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:297)
    at com.mongodb.connection.AsynchronousSocketChannelStream.readAsync(AsynchronousSocketChannelStream.java:125)
    at com.mongodb.connection.InternalStreamConnection.readAsync(InternalStreamConnection.java:444)
    at com.mongodb.connection.InternalStreamConnection.access$2000(InternalStreamConnection.java:66)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:541)
    at com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:517)
    at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
    at com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:447)
    at com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:444)
    at com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:218)
    at com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed(AsynchronousSocketChannelStream.java:201)
    at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishRead(UnixAsynchronousSocketChannelImpl.java:430)
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:191)
    at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213)
    at sun.nio.ch.KQueuePort$EventHandlerTask.run(KQueuePort.java:301)
    at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
空列表的标题
java.util.NoSuchElementException:空列表的头
在scala.collection.immutable.Nil$.head(List.scala:428)
位于scala.collection.immutable.Nil$.head(List.scala:425)
在org.mongodb.scala.bson.codecs.macrocodecs.MacroCodec.readDocument(MacroCodec.scala:204)上
位于org.mongodb.scala.bson.codecs.macrocodecs.macrocodecc.readDocument$(macrocodecc.scala:193)
位于de.peterschrott.mongotest.mongotest$$anon$1$TestDocumentMacroCodec$3.readDocument(mongotest.scala:29)
位于org.mongodb.scala.bson.codecs.macrocodecs.macrocodecc.readValue(macrocodecc.scala:173)
位于org.mongodb.scala.bson.codecs.macrocodecs.macrocodecc.readValue$(macrocodecc.scala:169)
位于de.peterschrott.mongotest.mongotest$$anon$1$TestDocumentMacroCodec$3.readValue(mongotest.scala:29)
位于org.mongodb.scala.bson.codecs.macrocodecs.macrocodecc.decode(macrocodecc.scala:104)
位于org.mongodb.scala.bson.codecs.macrocodecs.macrocodecc.decode$(macrocodecc.scala:96)
位于de.peterschrott.mongotest.mongotest$$anon$1$TestDocumentMacroCodec$3.decode(mongotest.scala:29)
位于com.mongodb.operation.commandResultaryCodec.decode(commandResultaryCodec.java:52)
位于com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:53)
位于org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
位于org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
位于org.bson.codecs.configuration.LazyCodec.decode(LazyCodec.java:47)
位于org.bson.codecs.BsonDocumentCodec.readValue(BsonDocumentCodec.java:101)
位于com.mongodb.operation.CommandResultDocumentCodec.readValue(CommandResultDocumentCodec.java:56)
位于org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:84)
位于org.bson.codecs.BsonDocumentCodec.decode(BsonDocumentCodec.java:41)
位于com.mongodb.connection.ReplyMessage(ReplyMessage.java:57)
在com.mongodb.connection.CommandProtocol.getResponseDocument(CommandProtocol.java:139)上
位于com.mongodb.connection.CommandProtocol.access$000(CommandProtocol.java:51)
在com.mongodb.connection.CommandProtocol$CommandResultCallback.CallCallCallback(CommandProtocol.java:271)上
位于com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:48)
位于com.mongodb.connection.ResponseCallback.onResult(ResponseCallback.java:23)
位于com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:470)
位于com.mongodb.connection.DefaultConnectionPool$PooledConnection$2.onResult(DefaultConnectionPool.java:464)
位于com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:119)
位于com.mongodb.connection.UsageTrackingInternalConnection$3.onResult(UsageTrackingInternalConnection.java:115)
位于com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:49)
在com.mongodb.connection.InternalStreamConnection.ExecuteCallbackandReceiverResponse(InternalStreamConnection.java:378)
访问com.mongodb.connection.InternalStreamConnection.access$1700(InternalStreamConnection.java:66)
位于com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:420)
位于com.mongodb.connection.InternalStreamConnection$ResponseBuffersCallback.onResult(InternalStreamConnection.java:389)
位于com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onSuccess(InternalStreamConnection.java:562)
在com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.access$2200(InternalStreamConnection.java:517)
在com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:584)
在com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback$ResponseBodyCallback.onResult(InternalStreamConnection.java:568)
在com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:447)
在com.mongodb.connection.InternalStreamConnection$3.completed(InternalStreamConnection.java:444)
在com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed上(AsynchronousSocketChannelStream.java:218)
在com.mongodb.connection.AsynchronousSocketChannelStream$BasicCompletionHandler.completed上(AsynchronousSocketChannelStream.java:201)
位于sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
位于sun.nio.ch.Invoker.invokeDirect(Invoker.java:157)
位于sun.nio.ch.unixasynchronoussocketchannelimpread(UnixAsynchronousSocketChannelImpl.java:553)
在sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketchannelmpl.java:276)
在sun.nio.ch.AsynchronousSocketChannelImpl.read(AsynchronousSocketChannelImpl.java:297)中
位于com.mongodb.connection.AsynchronousSocketChannelStream.readAsync(AsynchronousSocketChannelStream.java:125)
位于com.mongodb.connection.InternalStreamConnection.readAsync(InternalStreamConnection.java:444)
位于com.mongodb.connection.InternalStreamConnection.access$2000(InternalStreamConnection.java:66)
位于com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:541)
位于com.mongodb.connection.InternalStreamConnection$ResponseHeaderCallback.onResult(InternalStreamConnection.java:517)
在
case class TestDocument(_id: Long, nestedOne: Option[NestedOne])
case class NestedOne(nestedOneOne: Int, nestedOneTwo: Int)
val testCodecRegistry: CodecRegistry = fromRegistries(
  fromProviders(classOf[TestDocument], classOf[NestedOne]),
  DEFAULT_CODEC_REGISTRY
)
Document("_id" -> 6L,
         "nestedOne" -> Document("nestedOneOne" -> 1, "nestedOneTwo" -> 2))
Document(
  "_id" -> 6L,
  "nestedOne" -> List(Document("nestedOneOne" -> 123)),
  "nestedTwo" -> List(Document("nestedTwoOne" -> 789))
)