Obtener documentos mongodb con ciertos campos (proyecciones) utilizando Spring-integración (anotaciones solamente)

Atul Kaushik:

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.

Arteta:

Es un hecho que el expressioncomo segundo MongoDbMessageSourceargumento puede ser resuelto a la org.springframework.data.mongodb.core.query.Querydel 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 QueryAPI 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/excludelas devoluciones de llamada para los campos específicos que les gustaría ser devueltos.

Más información sobre Queryla 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 MongoTemplatedirectamente en lugar, es necesario escribir un código personalizado que debe ser llamado desde el MethodInvokingMessageSourceenvoltorio con la misma @InboundChannelAdapterconfiguración. En ese código que todavía tienen que construir un tal Queryobjeto 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 MongoDbMessageSourcedebe ser configurada como una separada @Beany ya sin @InboundChannelAdapteranotación. El IntegrationFlowTiene que haber otra @Beany 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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=215311&siteId=1
Recomendado
Clasificación