如何在不知道属性路径的情况下查询属性的存在

时间:2018-07-13 15:19:10

标签: azure-cosmosdb

是否有一种方法可以查询cosmos DB在文档中是否存在某个属性,而又不知道该属性确切位于何处,因为它可能出现在不同的位置?

基本上

SELECT * 
FROM SomeCollection
WHERE IS_DEFINED("here should be just the prop name w/o any path")

修改:
最初我错过了声明,我在寻找查询级别的解决方案,而不是编写用户定义的存储过程

1 个答案:

答案 0 :(得分:1)

您可以创建UDF,该UDF将以递归方式浏览所有对象属性,如果在任何级别上都找到,则返回true。在您的情况下,udf主体看起来可能与此类似

function findRecursive(theObject, searchingProperty){

    var result = null;
    if(theObject instanceof Array) {
        for(var i = 0; i < theObject.length; i++) {
            if (findRecursive(theObject[i]){
                return true;
            }
        }
    }
    else
    {
        for(var prop in theObject) {
            if(prop == searchingProperty) {
                return true;
            }
            if(theObject[prop] instanceof Object || theObject[prop] instanceof Array){
                if (findRecursive(theObject[prop])){
                    return true;
                }
            }
        }
    }
    return false;
}

UDF应与存储过程注册相同。并且可以从查询中调用。 因此您的选择将类似于下一个

SELECT * 
FROM root
WHERE udf.findRecursive(root, "here should be just the prop name w/o any path")

P.S。我没有测试代码,但是您应该了解基本思想