我试图从mongodb集合中获取所有文档,这些文档在最近5分钟内仅使用某些字段(例如field1,field2,field3等)进行了修改。如何编写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;
}
有没有一种方法,我可以仅使用MongoTemplate或MongoDbFactory而不是LiteralExpression来以MongoDbMessageSource或任何其他可以馈入pubsubChannel管道的格式获取某些字段(投影)。
答案 0 :(得分:1)
事实上,可以将expression
作为第二个MongoDbMessageSource
参数解析为org.springframework.data.mongodb.core.query.Query
对象。因此,它可能不只是简单的文字表达。对于您的投影用例,您可以编写如下内容:
new BasicQuery([QUERY_STRING], [FIELD_STRING])
从您的@myBean.getLiteralExpression()
返回。
该Query
API非常灵活,并提供了许多流利的钩子,可用于最终的MongoDB查询。例如,对于要返回的特定字段,fields()
有include/exclude
个回调。
Spring Data MongoDB手册中有关Query
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()
配置略有错误。您无法从该bean定义调用IntegrationFlows.from(messageSource);
。 MongoDbMessageSource
必须配置为单独的@Bean
,并且已经没有@InboundChannelAdapter
注释。 IntegrationFlow
必须是另一个@Bean
,您可以在那里真正使用DbReadingMessageSource()
中的from()
。但同样:没有@InboundChannelAdapter
。请参见参考手册:https://docs.spring.io/spring-integration/docs/current/reference/html/#java-dsl-inbound-adapters