Mongodb 使用Mongo Scala驱动程序宏读取包含其他嵌套字段的文档
是否可以使用从mongo db读取文档,其中包含案例类中指定字段的附加字段 我希望在反序列化时忽略案例类中未指定但文档中未指定的字段。但是会抛出一个异常。由于mongo db的无模式方法,不可能在case类中指定字段的总集合 我要反序列化的文档如下所示: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": {
{
"_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))
)