【问题标题】:Query in list of objects, looking for some attributes of different objects (CosmosDB SQL API)在对象列表中查询,查找不同对象的一些属性(CosmosDB SQL API)
【发布时间】:2019-03-25 20:00:01
【问题描述】:

当我尝试选择对象数组时,无法进行查询(CosmosDB SQL API)。 我想知道我搜索的所有参数是否都在不同的对象中。

应该找到下一个文档:

{
    "_id" : "97e9272d-cd7e-4a26-3245-o4e67h29beqw",
    "_type" : "Document",
    "categories" : [ 
        {
            "_name" : "PruebaCategoria", (searching by this)
            "Type" : "omega",
            "Policy number" : "1234567890",
            "date" : 1553081146391,
            "boolean" : true
        }, 
        {
            "_name" : "CategoryDemoTest",
            "Type" : "free",
            "Policy number" : "0987654321"
        }, 
        {
            "_name" : "CategoryDemoTestDates",
            "dateInitial" : 1553081146592, (and by this in range)
            "dateEnd" : 1553081146594,
            "Type" : "omega"
        }
    ],
    "partitionNumber" : 1,
    "serial" : 1
}

我想复制下一个与 mongodb API 一起使用的查询:

{ "categories" : { "$all" : [{ "$elemMatch" : { "dateInitial" : { "$gt" : { "$numberLong" : "1553081146591" }, "$lt" : { "$numberLong" : "1553081146593" } } } }, { "$elemMatch" : { "_name" : "PruebaCategoria" } }] } }

我尝试了以下查询,但似乎只有一个对象具有我要查找的所有元素时它们才匹配:

"SELECT VALUE c FROM c JOIN cat in c.categories WHERE cat._name=\"PruebaCategoria\" AND cat.dateInitial > 1553081146591 AND cat.dateInitial < 1553081146593"

是否存在进行此类搜索的方法(使用 CosmosDB SQL API)?

【问题讨论】:

    标签: azure-cosmosdb azure-cosmosdb-sqlapi


    【解决方案1】:

    根据cosmos db sql api中的所有Array Functions,在mongo db中并没有这种直接的方式来实现与"$all""$elemMatch"类似的功能。

    在此处提供stored procedure 解决方法。

    代码:

    function sample() {
        var collection = getContext().getCollection();
    
        var isAccepted = collection.queryDocuments(
            collection.getSelfLink(),
            'SELECT * FROM c',
        function (err, feed, options) {
            if (err) throw err;
    
            if (!feed || !feed.length) {
                var response = getContext().getResponse();
                response.setBody('no docs found');
            }
            else {
                var returnArray = [];
                for(var i =0;i<feed.length;i++){
                    var nameFlag = false;       
                    var dateInitialFlag = false;         
                    for(var j = 0;j<feed[i].categories.length;j++){              
                        if(nameFlag == false) {
                             if(feed[i].categories[j]._name == 'PruebaCategoria'){
                                nameFlag= true;
                             }
                        }
                        if(dateInitialFlag == false){
                             if(feed[i].categories[j].dateInitial <1553081146593 || feed[i].categories[j].dateInitial > 1553081146590){
                                dateInitialFlag= true;
                            }
                        }
                        if (nameFlag == true && dateInitialFlag == true) {
                            returnArray.push(feed[i]);
                            break;
                        } 
                    }
                }
                var response = getContext().getResponse();
                response.setBody(returnArray);
            }
        });
    
        if (!isAccepted) throw new Error('The query was not accepted by the server.');
    }
    

    您也可以pass arguments to SP,以便您可以动态过滤数据。

    【讨论】:

    • 感谢您的回复我在数据库中使用您的代码测试了存储过程,并且工作正常。
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2018-12-31
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多