2016-07-25 14 views
2

Meine Dokumente gespeichert sind, in JSON in Marklogic so (ich nutzlos Attribute für meinen Fall entfernen):Marklogic (NodeJS API) - Suchen Dokumente, die 2 (oder mehr) Bedingungen in Objektarray entsprechen Attribut

{ 
    documentId: '', 
    languages: [{ 
    locale: 'en_UK', 
    content: { 
     translated: 'true', 
    } 
    }, { 
    locale: 'de_DE', 
    content: { 
     translated: 'false', 
    } 
    }, {...}], 
} 

edit: Es scheint, dass meine "nutzlosen" Attribute einige Probleme verursachen. Hier mein detailliertes Objekt.

{ 
    documentId: '', 
    /* 4 attrs */, 
    languages: [{ 
     locale: 'en_UK', 
     attr: '', 
     content: { 
     /* 14 attrs */, 
     translated: true, 
     /* 2 or 4 attrs */, 
     } 
    }, { 
     locale: 'de_DE', 
     attr: '', 
     content: { 
     /* 14 attrs */, 
     translated: false, 
     /* 2 or 4 attrs */, 
     } 
    }, {...} 
    ], 
    /* 0 or 2 attrs */ 
} 

Ich versuche, alle Dokumente zu finden, die mindestens ein Objekt in Sprachen haben wo locale = 'de_DE' und content.translated = true mit

var query = 
    qb.where(
    qb.directory('myDocuments'), 
    qb.scope(
     qb.property('languages'), 
     qb.and(
     qb.scope(qb.property('code'), qb.term('en_UK')), 
     qb.scope(qb.property('translated'), qb.term('true')) 
    ), 
     qb.fragmentScope('properties') 
    ) 
); 

und

qb.where(
    qb.directory(myDocuments'), 
    qb.scope(qb.property('languages'), 
    qb.propertiesFragment(
     qb.value(
     qb.property('languages'), 
     qb.and(
      qb.scope(qb.property('code'), qb.term('en_UK')), 
      qb.scope(qb.property('translated'), qb.term('true')) 
     ) 
    ) 
    ) 
) 
) 

aber in beiden Fällen gibt die Abfrage Docume zurück nts, ​​die den 2 Bedingungen im gesamten Dokument entsprechen, nicht in jedem Objekt Sprachen Array.

Ich habe die Dokumentation gelesen, aber ich habe nichts gefunden. Hast du irgendwelche Ideen, wie ich meine Anfrage stellen kann?

bearbeiten: Ich versuche eine nahe Abfrage, aber es funktioniert nicht. Es passt nicht zu den guten Dokumenten.

qb.where(
    qb.directory(config.marklogicConfiguration.product), 
    qb.scope(qb.property('languages'), 
    qb.near(
     qb.and(
     qb.scope(qb.property('code'), qb.term('ja_JP')), 
     qb.scope(qb.property('translatedInTheLanguage'), qb.term('true')) 
    ), 
     1, 
     qb.weight(0), 
     qb.ordered(true) 
    ) 
) 
) 

Ich werde fragen, ob ich meine Objektstruktur ändern kann.

edit2: Schließlich verwende ich Xquery Anfrage, um das richtige Ergebnis zu erhalten.

xdmp:directory("/product/direcory/")/languages[code eq "ja_JP" and content/translated eq "true"] ! root(.) 

In meinem Fall verwende ich eq für content/übersetzte Zustand, weil mein boolean als String gespeichert ist. ! Wurzel (.): Return das ganze Objekt, nicht nur die Sprachobjekte, die den Zustand [code eq "ja_JP" und Inhalt/übersetzt eq "true"]

+0

XPath-Ausdrücke wie in Edit2 werden immer mit dem gefilterten Modus ausgeführt, und dieser wird möglicherweise weniger gut skaliert. – grtjn

Antwort

2

Versuchen Sie, eine near-query, eine mit Match von der Location Qualifiers available in structured queries. Geben Sie für Ihre Gebietsschemata und übersetzten Abfragen eine distance: 1 und ordered: true an. Beachten Sie, dass das hängt davon ab, wo die "nutzlosen Attribute" waren, die Sie entfernt haben.

Wenn das nicht funktioniert, müssen Sie wahrscheinlich eine andere Ebene in Ihre Struktur einfügen.

{ 
    documentId: '', 
    languages: [{ 
    item: { 
     locale: 'en_UK', 
     content: { 
     translated: 'true', 
     } 
    } 
    }, { 
    item: { 
     locale: 'de_DE', 
     content: { 
     translated: 'false', 
     } 
    } 
    }, {...}], 
} 

Das ist ziemlich nicht real, aber es würde Sie eine container-query laufen.

+1

Stellen Sie bei Verwendung von Near-Abfragen sicher, dass die relevanten Positionsindizes aktiviert sind. – grtjn