2016-07-25 58 views
2

我的文檔存儲在JSON在這樣marklogic搜索文件(我刪除了我的情況下無用的屬性):Marklogic(的NodeJS API) - 匹配對象數組2(或更多)的條件屬性

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

編輯:看來我的'無用的'屬性會導致一些問題。這裏我詳細的對象。

{ 
    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 */ 
} 

我試圖找到在語言至少一個對象中的所有文件,其中區域= 'en_UK'content.translated =真

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') 
    ) 
); 

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')) 
     ) 
    ) 
    ) 
) 
) 

但在這兩種情況下,查詢返回文檔在整個文檔中匹配2個條件的nts,而不是在語言數組的每個對象中。

我閱讀了文檔,但是我還沒有找到任何東西。你有什麼想法,我怎麼能做我的查詢?

編輯:我嘗試一個近查詢,但它不起作用。它不符合好的文件。

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「Ja_JP表示」作爲內容/翻譯EQ「真」]

+0

類似於edit2的XPath表達式將始終以過濾模式運行,並且可能不太好。 – grtjn

回答

2

嘗試使用near-query,一個的Location Qualifiers available in structured queries。提供您的語言環境和翻譯的查詢,請指定distance: 1ordered: true。請注意,這是否有效取決於您刪除的「無用屬性」的位置。

如果這不起作用,您可能需要在結構中引入另一個圖層。

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

這不是真的很漂亮,但它會讓你運行一個container-query

+1

使用接近查詢時,請確保啓用相關的位置索引。 – grtjn

相關問題