Marklogic在数组或对象内搜索并仅返回匹配的数组项(javascript)

时间:2017-08-23 11:39:00

标签: javascript json marklogic

是否可以搜索文档但只能使用数组元素中的特定属性进行搜索?此外,结果可能只包含匹配的数组元素而不是整个文档(因为同一文档中的其他数组元素可能不匹配)。

示例:给出JSON Marklogic文档 { "name": "aName", "children": [{ "name": "A", "target": { "min": 2, "max": 10 } },{ "name": "B", "target": { "min": 22, "max": 32 } },{ "name": "C", "target": { "min": 4, "max": 7 } }] } 我只想匹配children target.min< target.max 5和children[0]> 5。

在这种情况下,只有children[2] [ { "name": "A", "target": { "min": 2, "max": 10 } }, { "name": "C", "target": { "min": 4, "max": 7 } } ] 匹配。然后,我如何指定仅返回的查询: override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) DownloadManager.shared.onProgress = { (row, progress) in print("Downloading for \(row) with progress \(progress)") } return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let url = URL(string: "link")! DownloadManager.shared.identifier = indexPath.row let downloadTaskLocal = DownloadManager.shared.activate().downloadTask(with: url) downloadTaskLocal.resume() }

如何构建相关查询。注:我更喜欢服务器端javascript或Node.js实现。

3 个答案:

答案 0 :(得分:2)

对于Node.js,请查看queryBuilder.extract或搜索响应转换,看看其中任何一个是否满足您的需求。这两个主题都在这里讨论:http://docs.marklogic.com/guide/node-dev/search#id_24160

在SJS中,jsearch mapper和reducer hook提供了类似的功能。请参阅以下主题“使用地图和减少转换结果”:http://docs.marklogic.com/guide/search-dev/javascript#id_49222

答案 1 :(得分:2)

在MarkLogic 9中,您可以使用TDE为每个具有最小值和最大值的子项投影一行,并使用带有比较的光学查询。

目前,Optic不能用于Node.js,但这是有计划的。

在MarkLogic 8中,最好的方法是将每个子项建模为单独的文档,并在最小值和最大值上创建范围索引。

希望有帮助,

答案 2 :(得分:0)

试试这个

var a = {
    "name": "aName",
    "children": [{
        "name": "A",
        "target": {
            "min": 2,
            "max": 10
        }
    },{
        "name": "B",
        "target": {
            "min": 22,
            "max": 32
        }
    },{
        "name": "C",
        "target": {
            "min": 4,
            "max": 7
        }
    }]
};

var b = [];

for(var i of a.children){
if(i.target.min < 5 && i.target.max > 5){
 b.push(i);
}

}

console.log(b);