Estoy tratando de obtener todos los documentos de una colección mongodb que fueron modfied en los últimos 5 minutos con ciertos campos solamente (dicen campo1, campo2, field3 y así sucesivamente). Cómo escribir una LiteralExpression para obtener campos específicos (proyecciones)?
Mis actuales documentos de devolución expresión literal que contienen todos los campos (_id es marca de tiempo de la creación de documentos en mi colección):
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;
}
}
La cual se invoca en InboundChannelAdapter como
@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;
}
¿Hay alguna manera en que sólo puedo utilizar MongoTemplate o MongoDbFactory en lugar de un LiteralExpression a buscar solamente ciertos campos (proyección) en forma de MongoDbMessageSource o cualquier otro formato que se puede alimentar a mi tubería pubsubChannel.
Es un hecho que el expression
como segundo MongoDbMessageSource
argumento puede ser resuelto a la org.springframework.data.mongodb.core.query.Query
del objeto. Por lo tanto, puede que no sea simplemente una llanura expresión literal . Para su caso de uso de proyección puede escribir algo como:
new BasicQuery([QUERY_STRING], [FIELD_STRING])
para ser devuelto a su @myBean.getLiteralExpression()
.
Eso Query
API es bastante flexible y ofrece una gran cantidad de ganchos fluidos a configurar para la consulta final MongoDB. Por ejemplo, tiene una fields()
de include/exclude
las devoluciones de llamada para los campos específicos que les gustaría ser devueltos.
Más información sobre Query
la API en el manual del resorte de datos MongoDB: https://docs.spring.io/spring-data/mongodb/docs/2.1.5.RELEASE/reference/html/#mongodb-template-query
Si desea utilizar MongoTemplate
directamente en lugar, es necesario escribir un código personalizado que debe ser llamado desde el MethodInvokingMessageSource
envoltorio con la misma @InboundChannelAdapter
configuración. En ese código que todavía tienen que construir un tal Query
objeto a ser capaz de delegar en el MongoTemplate.find()
. Eso es exactamente lo que se hace en el MongoDbMessageSource
.
Fuera de cuestión: su DbReadingMessageSource()
configuración es un poco mal. No se puede llamar IntegrationFlows.from(messageSource);
de esa definición de frijol. El MongoDbMessageSource
debe ser configurada como una separada @Bean
y ya sin @InboundChannelAdapter
anotación. El IntegrationFlow
Tiene que haber otra @Bean
y hay que realmente puede utilizar su DbReadingMessageSource()
de esa from()
. Pero de nuevo: sin @InboundChannelAdapter
. Ver Manual de referencia: https://docs.spring.io/spring-integration/docs/current/reference/html/#java-dsl-inbound-adapters