spring data mongo reactive throw org.springframework.data.mapping.MappingException when eager loading nested @DbRef

huangapple go评论100阅读模式
英文:

spring data mongo reactive throw org.springframework.data.mapping.MappingException when eager loading nested @DbRef

问题

这是你提供的Java代码的中文翻译:

  1. 基本上我有一个包含对`UserPlot`plots集合的@DbRef`User`集合`UserPlot`我还有对`Plot`plot@DbRef我的目标是找到所有用户并急切加载plots`User`还急切加载plotUserPlot
  2. @Data
  3. @NoArgsConstructor
  4. @Document(collection = "users")
  5. public class User {
  6. @Id private String id;
  7. @Indexed(name = "ui_email", unique = true)
  8. private String email;
  9. private String password;
  10. @Indexed(name = "ui_first_name")
  11. private String firstName;
  12. @Indexed(name = "ui_last_name")
  13. private String lastName;
  14. @DBRef
  15. private List<UserPlot> plots;
  16. }
  17. @Data
  18. @Document(collection = "users_have_plots")
  19. public class UserPlot {
  20. @Id
  21. private String id;
  22. private String userId;
  23. @DBRef
  24. private Plot plot;
  25. }
  26. @Data
  27. @Document(collection = "plots")
  28. @NoArgsConstructor
  29. public class Plot {
  30. @Id
  31. private String id;
  32. private Integer x;
  33. private Integer y;
  34. }
  35. @Repository
  36. public interface UserRepository extends ReactiveMongoRepository<User, String> {
  37. @Aggregation(pipeline = {
  38. "{$lookup:{from:'users_have_plots',let:{plots:'$plots'},pipeline:[{$match:{$expr:{$in:['$_id',{$ifNull:'$$plots.$id',[]}]}}},{$lookup:{from:'plots',localField:'plot.$id',foreignField:'_id',as:'plot'}}],as:'plots'}}"
  39. })
  40. Flux<User> findAllIncludePlots();
  41. }
  42. @SpringBootApplication(exclude = UserDetailsServiceAutoConfiguration.class)
  43. @EnableReactiveMongoRepositories
  44. public class FarmApplication {
  45. public static void main(String[] args) {
  46. SpringApplication.run(FarmApplication.class, args);
  47. }
  48. @Bean
  49. CommandLineRunner t(UserRepository userRepository) {
  50. return a -> {
  51. userRepository.findAllIncludePlots().map(User::getPlots).doOnNext(System.out::println).subscribe();
  52. };
  53. }
  54. }

你提到的错误信息似乎与数据转换问题有关,但代码本身看起来没有明显错误。你可以检查数据库中的数据,确保它们符合预期。你提供的示例数据表明你有相关的引用关系,但问题可能在于数据不匹配或者自定义转换器的设置不正确。在调试这个问题时,你可能需要查看数据库数据以确认它们的一致性,并检查MongoDB的版本和配置是否与代码兼容。

英文:

Basically, I have a User collection that contains a @DbRef to UserPlot (plots) collection. Inside UserPlot, I also have a @DbRef to Plot (plot). My goal is to find all users and eagerly load plots to User (also eagerly load plot to UserPlot)

  1. @Data
  2. @NoArgsConstructor
  3. @Document(collection = &quot;users&quot;)
  4. public class User {
  5. @Id private String id;
  6. @Indexed(name = &quot;ui_email&quot;, unique = true)
  7. private String email;
  8. private String password;
  9. @Indexed(name = &quot;ui_first_name&quot;)
  10. private String firstName;
  11. @Indexed(name = &quot;ui_last_name&quot;)
  12. private String lastName;
  13. @DBRef
  14. private List&lt;UserPlot&gt; plots;
  15. }
  16. @Data
  17. @Document(collection = &quot;users_have_plots&quot;)
  18. public class UserPlot {
  19. @Id
  20. private String id;
  21. private String userId;
  22. @DBRef
  23. private Plot plot;
  24. }
  25. @Data
  26. @Document(collection = &quot;plots&quot;)
  27. @NoArgsConstructor
  28. public class Plot {
  29. @Id
  30. private String id;
  31. private Integer x;
  32. private Integer y;
  33. }
  34. @Repository
  35. public interface UserRepository extends ReactiveMongoRepository&lt;User, String&gt; {
  36. @Aggregation(pipeline = {
  37. &quot;{$lookup:{from:&#39;users_have_plots&#39;,let:{plots:&#39;$plots&#39;},pipeline:[{$match:{$expr:{$in:[&#39;$_id&#39;,{$ifNull:[&#39;$$plots.$id&#39;,[]]}]}}},{$lookup:{from:&#39;plots&#39;,localField:&#39;plot.$id&#39;,foreignField:&#39;_id&#39;,as:&#39;plot&#39;}}],as:&#39;plots&#39;}}&quot;
  38. })
  39. Flux&lt;User&gt; findAllIncludePlots();
  40. }
  41. @SpringBootApplication(exclude = UserDetailsServiceAutoConfiguration.class)
  42. @EnableReactiveMongoRepositories
  43. public class FarmApplication {
  44. public static void main(String[] args) {
  45. SpringApplication.run(FarmApplication.class, args);
  46. }
  47. @Bean
  48. CommandLineRunner t(UserRepository userRepository) {
  49. return a -&gt; {
  50. userRepository.findAllIncludePlots().map(User::getPlots).doOnNext(System.out::println).subscribe();
  51. };
  52. }
  53. }

When I invoke userRepository.findAllIncludePlots().map(User::getPlots).doOnNext(System.out::println).subscribe(); then i get this error:

  1. org.springframework.data.mapping.MappingException: Cannot convert [Document{{_id=6426b069ca83da130cdb7f70, x=0, y=0, _class=com.vilya.farm.domain.model.Plot}}] of type class java.util.ArrayList into an instance of class com.vilya.farm.domain.model.Plot; Implement a custom Converter&lt;class java.util.ArrayList, class com.vilya.farm.domain.model.Plot&gt; and register it with the CustomConversions; Parent object was: UserPlot(id=6426b073ca83da130cdb7f71, userId=6412c76956d4170a7de34d92, plot=null) -&gt; User(id=6412c76956d4170a7de34d92, email=abc@abc.com, password=$2a$10$s9VgOYd.fOKZF66TnAsjWemiCYkA7aG45NJpuSNgbVxpcIGF7fWqu, firstName=f, lastName=l, plots=null) -&gt; null
  2. Caused by: org.springframework.data.mapping.MappingException: Cannot convert [Document{{_id=6426b069ca83da130cdb7f70, x=0, y=0, _class=com.vilya.farm.domain.model.Plot}}] of type class java.util.ArrayList into an instance of class com.vilya.farm.domain.model.Plot; Implement a custom Converter&lt;class java.util.ArrayList, class com.vilya.farm.domain.model.Plot&gt; and register it with the CustomConversions; Parent object was: UserPlot(id=6426b073ca83da130cdb7f71, userId=6412c76956d4170a7de34d92, plot=null) -&gt; User(id=6412c76956d4170a7de34d92, email=abc@abc.com, password=$2a$10$s9VgOYd.fOKZF66TnAsjWemiCYkA7aG45NJpuSNgbVxpcIGF7fWqu, firstName=f, lastName=l, plots=null) -&gt; null
  3. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$DefaultConversionContext.convert(MappingMongoConverter.java:2292) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  4. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  5. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  6. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  7. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  8. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$ConversionContext.convert(MappingMongoConverter.java:2131) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  9. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1900) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  10. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:1359) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  11. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.lambda$getDbRefResolverCallback$1(MappingMongoConverter.java:632) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  12. at org.springframework.data.mongodb.core.convert.DefaultDbRefResolverCallback.resolve(DefaultDbRefResolverCallback.java:57) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  13. at org.springframework.data.mongodb.core.convert.DefaultDbRefResolver.resolveDbRef(DefaultDbRefResolver.java:85) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  14. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readAssociation(MappingMongoConverter.java:673) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  15. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readProperties(MappingMongoConverter.java:597) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  16. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.populateProperties(MappingMongoConverter.java:535) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  17. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:513) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  18. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readDocument(MappingMongoConverter.java:477) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  19. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$DefaultConversionContext.convert(MappingMongoConverter.java:2325) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  20. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  21. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  22. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$ConversionContext.convert(MappingMongoConverter.java:2131) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  23. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readCollectionOrArray(MappingMongoConverter.java:1402) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  24. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$DefaultConversionContext.convert(MappingMongoConverter.java:2297) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  25. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  26. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$AssociationConversionContext.convert(MappingMongoConverter.java:2208) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  27. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$ConversionContext.convert(MappingMongoConverter.java:2131) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  28. at org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1900) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  29. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:1359) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  30. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.lambda$getDbRefResolverCallback$1(MappingMongoConverter.java:632) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  31. at org.springframework.data.mongodb.core.convert.DefaultDbRefResolverCallback.resolve(DefaultDbRefResolverCallback.java:57) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  32. at org.springframework.data.mongodb.core.convert.DefaultDbRefResolver.resolveDbRef(DefaultDbRefResolver.java:85) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  33. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readAssociation(MappingMongoConverter.java:673) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  34. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readProperties(MappingMongoConverter.java:597) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  35. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.populateProperties(MappingMongoConverter.java:535) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  36. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:513) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  37. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readDocument(MappingMongoConverter.java:477) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  38. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:413) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  39. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:409) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  40. at org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:121) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  41. at org.springframework.data.mongodb.core.ReactiveMongoTemplate$ReadDocumentCallback.doWith(ReactiveMongoTemplate.java:2914) ~[spring-data-mongodb-4.0.0.jar:4.0.0]
  42. at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onNext(FluxConcatMapNoPrefetch.java:183) ~[reactor-core-3.5.0.jar:3.5.0]
  43. at reactor.core.publisher.FluxCreate$BufferAsyncSink.drain(FluxCreate.java:814) ~[reactor-core-3.5.0.jar:3.5.0]
  44. at reactor.core.publisher.FluxCreate$BufferAsyncSink.next(FluxCreate.java:739) ~[reactor-core-3.5.0.jar:3.5.0]
  45. at reactor.core.publisher.FluxCreate$SerializedFluxSink.next(FluxCreate.java:161) ~[reactor-core-3.5.0.jar:3.5.0]
  46. at java.base/java.util.ArrayList.forEach(ArrayList.java:1511) ~[na:na]
  47. at com.mongodb.reactivestreams.client.internal.BatchCursorFlux.lambda$recurseCursor$4(BatchCursorFlux.java:98) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  48. at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:171) ~[reactor-core-3.5.0.jar:3.5.0]
  49. at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.5.0.jar:3.5.0]
  50. at reactor.core.publisher.FluxPeekFuseable$PeekConditionalSubscriber.onNext(FluxPeekFuseable.java:854) ~[reactor-core-3.5.0.jar:3.5.0]
  51. at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[reactor-core-3.5.0.jar:3.5.0]
  52. at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  53. at com.mongodb.internal.operation.AsyncQueryBatchCursor.next(AsyncQueryBatchCursor.java:173) ~[mongodb-driver-core-4.8.0.jar:na]
  54. at com.mongodb.reactivestreams.client.internal.BatchCursor.lambda$next$0(BatchCursor.java:38) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  55. at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[reactor-core-3.5.0.jar:3.5.0]
  56. at reactor.core.publisher.Mono.subscribe(Mono.java:4444) ~[reactor-core-3.5.0.jar:3.5.0]
  57. at reactor.core.publisher.Mono.subscribeWith(Mono.java:4510) ~[reactor-core-3.5.0.jar:3.5.0]
  58. at reactor.core.publisher.Mono.subscribe(Mono.java:4272) ~[reactor-core-3.5.0.jar:3.5.0]
  59. at com.mongodb.reactivestreams.client.internal.BatchCursorFlux.recurseCursor(BatchCursorFlux.java:108) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  60. at com.mongodb.reactivestreams.client.internal.BatchCursorFlux.lambda$subscribe$0(BatchCursorFlux.java:60) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  61. at reactor.core.publisher.LambdaMonoSubscriber.onNext(LambdaMonoSubscriber.java:171) ~[reactor-core-3.5.0.jar:3.5.0]
  62. at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[reactor-core-3.5.0.jar:3.5.0]
  63. at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.5.0.jar:3.5.0]
  64. at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[reactor-core-3.5.0.jar:3.5.0]
  65. at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[reactor-core-3.5.0.jar:3.5.0]
  66. at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[reactor-core-3.5.0.jar:3.5.0]
  67. at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[reactor-core-3.5.0.jar:3.5.0]
  68. at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[reactor-core-3.5.0.jar:3.5.0]
  69. at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  70. at com.mongodb.reactivestreams.client.internal.OperationExecutorImpl.lambda$execute$2(OperationExecutorImpl.java:94) ~[mongodb-driver-reactivestreams-4.8.0.jar:na]
  71. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  72. at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[mongodb-driver-core-4.8.0.jar:na]
  73. at com.mongodb.internal.async.function.RetryingAsyncCallbackSupplier$RetryingCallback.onResult(RetryingAsyncCallbackSupplier.java:116) ~[mongodb-driver-core-4.8.0.jar:na]
  74. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  75. at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[mongodb-driver-core-4.8.0.jar:na]
  76. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  77. at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[mongodb-driver-core-4.8.0.jar:na]
  78. at com.mongodb.internal.operation.CommandOperationHelper.lambda$transformingReadCallback$10(CommandOperationHelper.java:332) ~[mongodb-driver-core-4.8.0.jar:na]
  79. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  80. at com.mongodb.internal.connection.DefaultServer$DefaultServerProtocolExecutor$1.onResult(DefaultServer.java:242) ~[mongodb-driver-core-4.8.0.jar:na]
  81. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  82. at com.mongodb.internal.connection.CommandProtocolImpl$1.onResult(CommandProtocolImpl.java:84) ~[mongodb-driver-core-4.8.0.jar:na]
  83. at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection$1.onResult(DefaultConnectionPool.java:683) ~[mongodb-driver-core-4.8.0.jar:na]
  84. at com.mongodb.internal.connection.UsageTrackingInternalConnection$2.onResult(UsageTrackingInternalConnection.java:159) ~[mongodb-driver-core-4.8.0.jar:na]
  85. at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[mongodb-driver-core-4.8.0.jar:na]
  86. at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:524) ~[mongodb-driver-core-4.8.0.jar:na]
  87. at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:501) ~[mongodb-driver-core-4.8.0.jar:na]
  88. at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:824) ~[mongodb-driver-core-4.8.0.jar:na]
  89. at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:788) ~[mongodb-driver-core-4.8.0.jar:na]
  90. at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:648) ~[mongodb-driver-core-4.8.0.jar:na]
  91. at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:645) ~[mongodb-driver-core-4.8.0.jar:na]
  92. at com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:319) ~[mongodb-driver-core-4.8.0.jar:na]
  93. at com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:266) ~[mongodb-driver-core-4.8.0.jar:na]
  94. at com.mongodb.internal.connection.InternalStreamConnection.readAsync(InternalStreamConnection.java:645) ~[mongodb-driver-core-4.8.0.jar:na]
  95. at com.mongodb.internal.connection.InternalStreamConnection.access$600(InternalStreamConnection.java:89) ~[mongodb-driver-core-4.8.0.jar:na]
  96. at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:778) ~[mongodb-driver-core-4.8.0.jar:na]
  97. at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback.onResult(InternalStreamConnection.java:763) ~[mongodb-driver-core-4.8.0.jar:na]
  98. at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:648) ~[mongodb-driver-core-4.8.0.jar:na]
  99. at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:645) ~[mongodb-driver-core-4.8.0.jar:na]
  100. at com.mongodb.connection.netty.NettyStream.readAsync(NettyStream.java:319) ~[mongodb-driver-core-4.8.0.jar:na]
  101. at com.mongodb.connection.netty.NettyStream.handleReadResponse(NettyStream.java:347) ~[mongodb-driver-core-4.8.0.jar:na]
  102. at com.mongodb.connection.netty.NettyStream.access$1100(NettyStream.java:105) ~[mongodb-driver-core-4.8.0.jar:na]
  103. at com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:421) ~[mongodb-driver-core-4.8.0.jar:na]
  104. at com.mongodb.connection.netty.NettyStream$InboundBufferHandler.channelRead0(NettyStream.java:418) ~[mongodb-driver-core-4.8.0.jar:na]
  105. at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:99) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  106. at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  107. at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  108. at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  109. at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  110. at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  111. at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  112. at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  113. at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  114. at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  115. at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  116. at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  117. at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) ~[netty-transport-4.1.85.Final.jar:4.1.85.Final]
  118. at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) ~[netty-common-4.1.85.Final.jar:4.1.85.Final]
  119. at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.85.Final.jar:4.1.85.Final]
  120. at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.85.Final.jar:4.1.85.Final]
  121. at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

I think there is a problem with my @Aggregation but I cannot find out the reason. Please help. Thank you

EDIT: my data looks like

  1. vilya_be&gt; db.plots.find({})
  2. [
  3. {
  4. _id: ObjectId(&quot;6426b069ca83da130cdb7f70&quot;),
  5. x: 0,
  6. y: 0,
  7. _class: &#39;com.vilya.farm.domain.model.Plot&#39;
  8. }
  9. ]
  10. vilya_be&gt; db.users_have_plots.find({})
  11. [
  12. {
  13. _id: ObjectId(&quot;6426b073ca83da130cdb7f71&quot;),
  14. userId: &#39;6412c76956d4170a7de34d92&#39;,
  15. plot: DBRef(&quot;plots&quot;, ObjectId(&quot;6426b069ca83da130cdb7f70&quot;)),
  16. _class: &#39;com.vilya.farm.domain.model.UserPlot&#39;
  17. }
  18. ]
  19. vilya_be&gt; db.users.find({})
  20. [
  21. {
  22. _id: ObjectId(&quot;6412c76956d4170a7de34d92&quot;),
  23. email: &#39;abc@abc.com&#39;,
  24. password: &#39;$2a$10$s9VgOYd.fOKZF66TnAsjWemiCYkA7aG45NJpuSNgbVxpcIGF7fWqu&#39;,
  25. firstName: &#39;f&#39;,
  26. lastName: &#39;l&#39;,
  27. plots: [ DBRef(&quot;users_have_plots&quot;, ObjectId(&quot;6426b073ca83da130cdb7f71&quot;)) ],
  28. _class: &#39;com.vilya.farm.domain.model.User&#39;
  29. },
  30. {
  31. _id: ObjectId(&quot;6414667360e4ba4481052627&quot;),
  32. email: &#39;abc1@abc.com&#39;,
  33. password: &#39;$2a$10$OP52phZ61l2JX2e2TQOu9ubYFBYcPeqEZ92ox2Nyyp5e.MEZk7GhS&#39;,
  34. firstName: &#39;f&#39;,
  35. lastName: &#39;l&#39;,
  36. _class: &#39;com.vilya.farm.domain.model.User&#39;
  37. }
  38. ]

mongo version: mongo:6.0.2-focal running on docker desktop

答案1

得分: 1

错误提示您收到了一个数组而不是一个对象的情况,这发生在"plot"键上。如果您检查您的文档"UserPlot",您会发现"Plot"是一个属性,而不是一个数组。因此,第二次查找操作返回一个数组。

所以,您需要使用$unwind来在聚合操作中将数组转换为对象。由于我们始终只有一个plot,所以可以使用它。$unwind文档

更新后的聚合操作:

  1. {$lookup:{from:&#39;users_have_plots&#39;,let:{plots:&#39;$plots&#39;},pipeline:[{$match:{$expr:{$in:[&#39;$_id&#39;,{$ifNull:[&#39;$$plots.$id&#39;,[]]}]}}},{$lookup:{from:&#39;plots&#39;,localField:&#39;plot.$id&#39;,foreignField:&#39;_id&#39;,as:&#39;plot&#39;}},{$unwind: &#39;$plot&#39;}],as:&#39;plots&#39;}}

给出了plot中的对象结果:

  1. [
  2. {
  3. _id: ObjectId(&quot;6412c76956d4170a7de34d92&quot;),
  4. email: &#39;abc@abc.com&#39;,
  5. password: &#39;$2a$10$s9VgOYd.fOKZF66TnAsjWemiCYkA7aG45NJpuSNgbVxpcIGF7fWqu&#39;,
  6. firstName: &#39;f&#39;,
  7. lastName: &#39;l&#39;,
  8. plots: [
  9. {
  10. _id: ObjectId(&quot;6426b073ca83da130cdb7f71&quot;),
  11. userId: &#39;6412c76956d4170a7de34d92&#39;,
  12. plot: {
  13. _id: ObjectId(&quot;6426b069ca83da130cdb7f70&quot;),
  14. x: 0,
  15. y: 0,
  16. _class: &#39;com.vilya.farm.domain.model.Plot&#39;
  17. },
  18. _class: &#39;com.vilya.farm.domain.model.UserPlot&#39;
  19. }
  20. ],
  21. _class: &#39;com.vilya.farm.domain.model.User&#39;
  22. },
  23. {
  24. _id: ObjectId(&quot;6414667360e4ba4481052627&quot;),
  25. email: &#39;abc1@abc.com&#39;,
  26. password: &#39;$2a$10$OP52phZ61l2JX2e2TQOu9ubYFBYcPeqEZ92ox2Nyyp5e.MEZk7GhS&#39;,
  27. firstName: &#39;f&#39;,
  28. lastName: &#39;l&#39;,
  29. _class: &#39;com.vilya.farm.domain.model.User&#39;,
  30. plots: []
  31. }
  32. ]
英文:

> type class java.util.ArrayList into an instance of class com.vilya.farm.domain.model.Plot;

The error says that you are getting an array instead of an object at the plot key. If you check your document UserPlot you have Plot as a property, not an array. So aggregation from the second lookup is returning an array.

So, you need to use $unwind to convert the array to an object in aggregation. As, we have always 1 plot so we can use that. $unwind documentation

Updated Aggregation:

  1. {$lookup:{from:&#39;users_have_plots&#39;,let:{plots:&#39;$plots&#39;},pipeline:[{$match:{$expr:{$in:[&#39;$_id&#39;,{$ifNull:[&#39;$$plots.$id&#39;,[]]}]}}},{$lookup:{from:&#39;plots&#39;,localField:&#39;plot.$id&#39;,foreignField:&#39;_id&#39;,as:&#39;plot&#39;}},{$unwind: &#39;$plot&#39;}],as:&#39;plots&#39;}}

Gives result an object in plot:

  1. [
  2. {
  3. _id: ObjectId(&quot;6412c76956d4170a7de34d92&quot;),
  4. email: &#39;abc@abc.com&#39;,
  5. password: &#39;$2a$10$s9VgOYd.fOKZF66TnAsjWemiCYkA7aG45NJpuSNgbVxpcIGF7fWqu&#39;,
  6. firstName: &#39;f&#39;,
  7. lastName: &#39;l&#39;,
  8. plots: [
  9. {
  10. _id: ObjectId(&quot;6426b073ca83da130cdb7f71&quot;),
  11. userId: &#39;6412c76956d4170a7de34d92&#39;,
  12. plot: {
  13. _id: ObjectId(&quot;6426b069ca83da130cdb7f70&quot;),
  14. x: 0,
  15. y: 0,
  16. _class: &#39;com.vilya.farm.domain.model.Plot&#39;
  17. },
  18. _class: &#39;com.vilya.farm.domain.model.UserPlot&#39;
  19. }
  20. ],
  21. _class: &#39;com.vilya.farm.domain.model.User&#39;
  22. },
  23. {
  24. _id: ObjectId(&quot;6414667360e4ba4481052627&quot;),
  25. email: &#39;abc1@abc.com&#39;,
  26. password: &#39;$2a$10$OP52phZ61l2JX2e2TQOu9ubYFBYcPeqEZ92ox2Nyyp5e.MEZk7GhS&#39;,
  27. firstName: &#39;f&#39;,
  28. lastName: &#39;l&#39;,
  29. _class: &#39;com.vilya.farm.domain.model.User&#39;,
  30. plots: []
  31. }
  32. ]

huangapple
  • 本文由 发表于 2023年3月31日 18:15:01
  • 转载请务必保留本文链接:https://go.coder-hub.com/75897357.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定