MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie erstelle ich eine dynamische Equals-Abfrage mit Apache Camel und MongoDB?

Für den Anfang wird diese obige Aussage nicht kompiliert. In einer anderen Frage wurde ich darauf hingewiesen, dass es einen Fehler in der aktuellen Apache Camel MongoDB-Dokumentation gibt und dass der setHeader Zeile oben sollte lauten:

.setHeader(MongoDbConstants.CRITERIA, constant(Filters.eq("name", "Raul Kripalani"))

Am Ende habe ich das gemacht, indem ich einen anonymen Expression erstellt habe :

import com.mongodb.client.model.Filters;
import com.mongodb.BasicDBObject;
import org.bson.conversions.Bson;

@Component
public class NotifyClientRoute extends RouteBuilder {
    public static final String NOTIFY_CLIENT_URI = "direct:notifyClient";

    @Override
    public void configure() throws Exception {

      from(NOTIFY_CLIENT_URI)
        .log("Determining which client gets the deletion request next for DR request '${header.drRequestId}'.")
        .setHeader(MongoDbConstants.CRITERIA, new Expression() {
            @Override
            public <T> T evaluate(Exchange exchange, Class<T> type) {
                String drRequestId = exchange.getIn().getHeader("drRequestId", String.class);

                Bson equalsClause = Filters.eq("drRequestId", drRequestId);

                // Alternatively:
                // Bson equalsClause = new BasicDBObject("drRequestId", new BasicDBObject("$eq", drRequestId));

                return exchange.getContext().getTypeConverter().convertTo(type, equalsClause);
            };
        })
        .to("mongodb:mongoClient?database=mydb&collection=mycollection&operation=findOneByQuery")
        .log("Query returned: '${body}'");
    }
}

Zusätzliche Anmerkung:Ich habe diese return-Anweisung im Expression nicht gefunden . Ich bin auf Tippfehler gestoßen und habe mir daher einen anderen Apache Camel Expression angesehen Implementierungen, die in den Camel-Bibliotheken enthalten waren, kehrten zurück, und ich fand diese Rückkehrklausel.