Запрос в списке объектов, поиск некоторых атрибутов различных объектов (SQL API CosmosDB) - PullRequest
1 голос
/ 25 марта 2019

У меня проблемы с выполнением запроса (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"

Существует ли метод для поиска такого типа (с API-интерфейсом CosmosDB)?

1 Ответ

0 голосов
/ 26 марта 2019

Согласно всем функциям массива в cosmos db, sql api, такого прямого способа реализации функций, подобных "$all" plus "$elemMatch" в mongo db, не существует.

Укажите хранимую процедуру Обходной путь здесь.

Код:

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.');
}

Вы также можете передавать аргументы в SP , чтобы можно было динамически фильтровать данные.

...