我正在尝试使用部分搜索序列号来查询文档。文件的结构如下:
{
"id": "AAAAA",
"serialNumber": "AAA12345",
"type1Component":
{
"componentId": "component1",
"serialNumber": "BBBCOMPSN1"
},
"type2Component":
{
"componentId": "component2",
"serialNumber": "CCCCOMPSN2"
},
"subComponents": [
"ZZZCOMP9",
"YYYCOMP8",
"XXXCOMP7",
"ZZZCOMP6"
]
}
查询应返回任何顶级或组件序列号包含与输入的部分匹配的文档。例如,如果搜索条件是以下任何一项,则上述文档应返回:AAA,BBB,CCC,XXX,YYY,ZZZ
我不知道该怎么做。到目前为止,这是我最好的尝试:
SELECT VALUE root FROM root
join comp1 in root.type1Component
join comp2 in root.type2Component
join sub in root.subComponents
where ( contains(upper(root.serialNumber), 'AAA') or
contains(upper(comp1.serialNumber), 'AAA') or
contains(upper(comp2.serialNumber), 'AAA') or
contains(upper(sub), 'AAA')
)
但是这个查询没有命中。谁能告诉我我做错了什么?
答案 0 :(得分:0)
subComponents数组导致此方法出现问题,因为您需要将ARRAY_CONTAINS
与字符串CONTAINS
合并,并且在查询中无法执行此操作。
此外,upper()
的使用意味着它将成为全表扫描。如果您可以使用它,则可以使用以下用户定义函数(UDF)完成此操作:
function snSearch (rootSN, sub1, sub2, subArray, s) {
if (rootSN.toUpperCase().indexOf(s) >= 0) {
return true;
};
if (sub1.serialNumber.toUpperCase().indexOf(s) >= 0) {
return true;
};
if (sub2.serialNumber.toUpperCase().indexOf(s) >= 0) {
return true;
};
var i, len, row;
for (i = 0, len = subArray.length; i < len; i++) {
row = subArray[i];
if (row.toUpperCase().indexOf(s) >= 0) {
return true;
};
};
return false;
}
你可以在这样的查询中调用它:
SELECT * FROM c WHERE
udf.snSearch(c.serialNumber, c.type1Component, c.type2Component, c.subComponents, 'ZZZ')