Marklogic(Nodejs API)-搜索符合对象数组属性中2个(或更多)条件的文档

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

我的文档以JSON格式存储在marklogic中,如下所示(我删除了案例中无用的属性):

编辑:我的“无用”属性似乎会导致一些问题。这是我的详细目标

{
  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',
      }
    }
  }, {...}],
}