春の統合を使用して特定のフィールド(予測)とMongoDBのドキュメント(注釈のみ)を取得します

アトゥールKaushikによる:

私は特定のフィールド(フィールド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()

そのQueryAPIはかなり柔軟性があり、最終的な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

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=215308&siteId=1