2016-08-01 23 views
0

Ich repariere eine Abfrage auf meiner API mit der Nodejs-Bibliothek, aber ich verlor die Facette in der Geschichte.Marklogic (Nodejs API) - Fügen Sie Facette auf XPath Abfrage

Anfangs wurde die Abfrage (mit Facette) mit dem QueryBuilder durchgeführt.

var config = require('./config'); 
var db marklogic.createDatabaseClient(config.marklogic); 
var qb = marklogic.queryBuilder; 

var queryElements = [ 
    qb.directory('/product/'), 
    qb.word('brand', 'myBrand') 
    /* we add optional conditions here */ 
]; 

// facets 
var facetQuery = qb.where(); 
facetQuery.optionsName = 'search_option'; 
facetQuery.view = 'facets'; 
facetQuery.search = { 
    query: qb.and.apply(qb, queryElements) 
}; 

return db.documents.query(facetQuery).result(function(documents) { 
    console.log(JSON.stringify(documents, null, 4)); 
}); 

Diese Abfrage gibt in einigen Fällen falsche Daten zurück, also ändere ich sie mit einer XPath-Abfrage.

var config = require('./config'); 
var db marklogic.createDatabaseClient(config.marklogic); 

var query = 'xdmp:directory("/product")[ attr1 eq "" /* and some optional conditions */]/languages[ code eq "es_ES" and content/category eq "something" /* and some optional conditions */] ! root(.)'; 

return db.xqueryEval(query, {}) 
.result(function(results) { 
    console.log(JSON.stringify(results, null, 2)); 
}); 

Die Abfrage funktioniert gut, aber jetzt muss ich Facetten hinzufügen, um die Kompatibilität zu erhalten. Ich habe gesucht, wie Facette auf XPath-Abfrage mit Nodejs-Bibliothek (Dokumentation, Beispiel, Tuto, ...) hinzufügen, aber ich habe nichts gefunden.

Haben Sie eine Idee, wie ich es tun kann?

Thx

+0

Ich denke, Ihre beste Wette ist zu adressieren, warum Ihre erste Frage falsche Daten zurückgab. Solche [Abfragen werden ungefiltert ausgeführt] (http://docs.marklogic.com/guide/performance/unfiltered#chapter), sodass Sie entweder gefilterte oder (besser) Ihre Indizes anders konfigurieren können. Können Sie mehr über die falschen Ergebnisse sagen? –

+0

Ich habe ein Objekt-Array in meinem Dokument und ich muss Dokumente finden, in denen ich mindestens eines der Objekte, deren Match n Bedingungen. Wenn ich queryBuilder verwende, finde ich Dokumente, bei denen Bedingungen irgendwo in allen Objekten übereinstimmen, nicht notwendigerweise im selben Objekt. Derzeit können wir diese Art von Abfrage für JSON-Dokumente in Marklogic mit dem QueryBuilder nicht durchführen. Ich muss XPath-Abfrage verwenden, um Bedingungen auf jedem Objekt anzuwenden –

Antwort

1

Wenn Sie die internen Eigenschaften verwenden, von der Builder anstelle der dokumentierten Funktionen Objekte, nehmen Sie ein Risiko, da die internen Eigenschaften jederzeit ändern könnte, Ihren Code zu brechen.

Zum Beispiel, wenn Sie eine Abfrage angeben möchten, können Sie die Funktion anstelle der Zuordnung Eigenschaften aufrufen:

const query = qb.where (queryElements);

Wenn Sie Facetten erstellen möchten, sollten Sie die Facette() und berechnen() Funktionen - siehe:

http://docs.marklogic.com/guide/node-dev/search#id_74030

facettiert sind komplett aus den Indizes gebaut - das ist der einzige Weg, um Facetten mit guter Performance im Maßstab zu implementieren - und kann daher nur mit Abfragen anstelle von XPaths gefiltert werden.

+0

Ich schließe mich dem Projekt an und entdecke den vorhandenen Code. Ich versuche nur ein paar Bugs zu beheben, ohne zu viel Code zu bekommen. –