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"]
XPath-Ausdrücke wie in Edit2 werden immer mit dem gefilterten Modus ausgeführt, und dieser wird möglicherweise weniger gut skaliert. – grtjn