如何在 documentdb 中编写查询以匹配精确数组?
How to write query in documentdb to match exact arrays?
假设在 documentdb 集合中我有 1 个文档:
即{
"school": "1254",
"types": [
"manager","customer", "teacher","principal"
]
}
现在我想编写 1 个带有类型的查询,假设我有与现有文档具有相同值的类型,那么如何匹配查询中的两个数组?
如果您想要子集匹配,我建议您(在代码中)构造一个包含一堆 AND
的查询:
SELECT * FROM c WHERE <myArray[0]> IN c.types AND <myArray[1]> IN c.types...
或者如果你想要一个真正精确的匹配,包括顺序:
SELECT * FROM c WHERE c.types[0] = <myArray[0]> AND c.types[1] = <myArray[1]>...
或者如果你想要精确但不按顺序这样:
SELECT * FROM c WHERE c.types[0] IN <myArray> AND c.types[1] IN <myArray>...
我的猜测是它们的性能都差不多,但是如果您发现带有 IN
子句的两个性能不如使用 =
的那个,那么您可能想要存储数组时对数组进行排序,然后对要比较的数组进行排序。
您也可以使用 UDF 来完成此操作,但这不允许使用索引并导致完整的 table 扫描。也就是说,如果您有其他高度选择性的标准,那么在 WHERE
子句的那一端使用 UDF 可能没问题。
假设在 documentdb 集合中我有 1 个文档:
即{
"school": "1254",
"types": [
"manager","customer", "teacher","principal"
]
}
现在我想编写 1 个带有类型的查询,假设我有与现有文档具有相同值的类型,那么如何匹配查询中的两个数组?
如果您想要子集匹配,我建议您(在代码中)构造一个包含一堆 AND
的查询:
SELECT * FROM c WHERE <myArray[0]> IN c.types AND <myArray[1]> IN c.types...
或者如果你想要一个真正精确的匹配,包括顺序:
SELECT * FROM c WHERE c.types[0] = <myArray[0]> AND c.types[1] = <myArray[1]>...
或者如果你想要精确但不按顺序这样:
SELECT * FROM c WHERE c.types[0] IN <myArray> AND c.types[1] IN <myArray>...
我的猜测是它们的性能都差不多,但是如果您发现带有 IN
子句的两个性能不如使用 =
的那个,那么您可能想要存储数组时对数组进行排序,然后对要比较的数组进行排序。
您也可以使用 UDF 来完成此操作,但这不允许使用索引并导致完整的 table 扫描。也就是说,如果您有其他高度选择性的标准,那么在 WHERE
子句的那一端使用 UDF 可能没问题。