Marklogic(Nodejs API)-搜索符合对象数组属性中2个(或更多)条件的文档
我的文档以JSON格式存储在marklogic中,如下所示(我删除了案例中无用的属性): 编辑:我的“无用”属性似乎会导致一些问题。这是我的详细目标Marklogic(Nodejs API)-搜索符合对象数组属性中2个(或更多)条件的文档,marklogic,marklogic-8,Marklogic,Marklogic 8,我的文档以JSON格式存储在marklogic中,如下所示(我删除了案例中无用的属性): 编辑:我的“无用”属性似乎会导致一些问题。这是我的详细目标 { documentId: '', /* 4 attrs */, languages: [{ locale: 'en_UK', attr: '', content: { /* 14 attrs */, translated: true, /* 2 or 4
{
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 */
}
我尝试在语言中查找至少有一个对象的所有文档,其中locale='en_UK'和content.translated=true with
及
但在这两种情况下,查询都会返回与整个文档中的两个条件相匹配的文档,而不是在languages数组的每个对象中
我看了文档,但什么也没找到。你知道我该如何提问吗
编辑:我尝试了一个近似查询,但它不起作用。它与好的文件不匹配
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)
)
)
)
我将询问是否可以更改对象结构
edit2:最后,我使用Xquery请求获得正确的结果
xdmp:directory("/product/direcory/")/languages[code eq "ja_JP" and content/translated eq "true"] ! root(.)
在我的例子中,我使用eq作为内容/转换条件,因为我的布尔值存储为字符串。
!root(.):返回整个对象,而不仅仅是符合条件[code eq“ja_JP”和content/translated eq“true”的语言对象]尝试使用。提供您的区域设置和翻译查询,指定距离:1和顺序:true。请注意,这是否有效将取决于您删除的“无用属性”的位置
如果这不起作用,您可能需要在结构中引入另一层
{
documentId: '',
languages: [{
item: {
locale: 'en_UK',
content: {
translated: 'true',
}
}
}, {
item: {
locale: 'de_DE',
content: {
translated: 'false',
}
}
}, {...}],
}
这不太漂亮,但它可以让你跑一圈 edit2中的XPath表达式将始终以过滤模式运行,这可能无法很好地扩展。
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)
)
)
)
xdmp:directory("/product/direcory/")/languages[code eq "ja_JP" and content/translated eq "true"] ! root(.)
{
documentId: '',
languages: [{
item: {
locale: 'en_UK',
content: {
translated: 'true',
}
}
}, {
item: {
locale: 'de_DE',
content: {
translated: 'false',
}
}
}, {...}],
}