私は特定のフィールド(フィールド1、フィールド2、FIELD3などを言う)との最後の5分でmodfiedたMongoDBのコレクションからすべての文書を取得しようとしています。どのように特定のフィールド(予測)を取得するためにLiteralExpressionを書くには?
すべてのフィールドを含む私の現在のリテラル式の戻り文書(_idは私のコレクションでの文書作成のタイムスタンプです):
public String getLiteralExpression(){
long innerBoundary = Instant.now().minus(5, ChronoUnit.MINUTES).toEpochMilli();
long outerBoundary = Instant.now().toEpochMilli();
String expression = new StringBuilder()
.append("{'_id': {'$gt': ")
.append(innerBoundary)
.append(", '$lt' : ")
.append(outerBoundary)
.append("}}")
.toString();
return expression;
}
}
どのInboundChannelAdapterように呼び出されています
@Bean
@InboundChannelAdapter(value = "pubSubChannel", poller = @Poller(fixedRate = "30000"))
public MessageSource<Object> DbReadingMessageSource() {
Expression expression = new SpelExpressionParser().parseExpression("@myBean.getLiteralExpression()");
MongoDbMessageSource messageSource = new MongoDbMessageSource(mongoTemplate, expression);
messageSource.setCollectionNameExpression(new LiteralExpression(mongoTemplate.getCollectionName(MyEntity.class)));
IntegrationFlows.from(messageSource);
return messageSource;
}
私はちょうどMongoDbMessageSourceの形態または私pubsubChannelパイプラインに供給することができる任意の他の形式においてのみ特定のフィールド(投影)をフェッチするMongoTemplate又はMongoDbFactory代わりにLiteralExpressionを使用することができる方法があります。
それは事実だexpression
第二として、MongoDbMessageSource
引数はに解決することができますorg.springframework.data.mongodb.core.query.Query
オブジェクト。だから、それは単なるではないかもしれませんリテラル表現。あなたの投影ユースケースのためにあなたのような何かを書くことがあります。
new BasicQuery([QUERY_STRING], [FIELD_STRING])
あなたから返されます@myBean.getLiteralExpression()
。
そのQuery
APIはかなり柔軟性があり、最終的なMongoDBのクエリのために設定される流暢フックの多くを提供します。例えば、それは持っているfields()
ためinclude/exclude
、特定のフィールドのコールバックあなたが返されるしたいと思います。
さらに詳しい情報Query
春データのMongoDBマニュアルのAPI:https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/reference/html/#mongodb-template-query
あなたが使用したい場合はMongoTemplate
、直接その代わり、あなたはから呼び出されるべきカスタムコード記述する必要がMethodInvokingMessageSource
同じでラッパー@InboundChannelAdapter
の構成を。このコードでは、あなたはまだ、そのような構築する必要がありますQuery
に委任することができるようにするオブジェクトをMongoTemplate.find()
。それはで行われているまさにですMongoDbMessageSource
。
論外:あなたのDbReadingMessageSource()
構成が少し間違っています。あなたは呼び出すことはできませんIntegrationFlows.from(messageSource);
そのBean定義から。MongoDbMessageSource
別々に設定する必要があり@Bean
、すでになし@InboundChannelAdapter
注釈。IntegrationFlow
他にする必要があり@Bean
、あなたが本当にあなたが使用できるDbReadingMessageSource()
ことからfrom()
。しかし、再び:なし@InboundChannelAdapter
。参照リファレンスマニュアル:https://docs.spring.io/spring-integration/docs/current/reference/html/#java-dsl-inbound-adapters