Stored procedures 我可以检查唯一性并在Cosmos DB存储过程中编写文档吗

Stored procedures 我可以检查唯一性并在Cosmos DB存储过程中编写文档吗,stored-procedures,azure-cosmosdb,Stored Procedures,Azure Cosmosdb,我有一个Cosmos DB存储过程,它可以创建一个新文档(如果它不存在),并返回现有文档或新文档。可以从不同的进程调用该过程。即使多个客户端同时尝试创建文档,我是否可以确保文档只创建一次 function createIfNotExists(param1, param2) { var collection = getContext().getCollection(); // Query documents and take 1st item. var query = '

我有一个Cosmos DB存储过程,它可以创建一个新文档(如果它不存在),并返回现有文档或新文档。可以从不同的进程调用该过程。即使多个客户端同时尝试创建文档,我是否可以确保文档只创建一次

function createIfNotExists(param1, param2) {
    var collection = getContext().getCollection();

    // Query documents and take 1st item.
    var query = 'SELECT * FROM c WHERE c.Param1="' + param1 + '" AND c.Param2="' + param2 + '"';
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        query,
        function (err, items, options) {
            if (err) throw err;

            var response = getContext().getResponse();
            if (!items || !items.length) {
                var accepted = collection.createDocument(collection.getSelfLink(),
                {
                    Param1: param1,
                    Param2: param2
                },
                function (err, itemCreated) {
                    if (err) throw err;
                    response.setBody(itemCreated);
                });

                if (!accepted) throw new Error('Could not create document');
            }
            else {
                response.setBody(items[0]);
            }
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
我是否可以确保文档仅创建一次(即使是多次创建) 客户试图同时创建它

function createIfNotExists(param1, param2) {
    var collection = getContext().getCollection();

    // Query documents and take 1st item.
    var query = 'SELECT * FROM c WHERE c.Param1="' + param1 + '" AND c.Param2="' + param2 + '"';
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        query,
        function (err, items, options) {
            if (err) throw err;

            var response = getContext().getResponse();
            if (!items || !items.length) {
                var accepted = collection.createDocument(collection.getSelfLink(),
                {
                    Param1: param1,
                    Param2: param2
                },
                function (err, itemCreated) {
                    if (err) throw err;
                    response.setBody(itemCreated);
                });

                if (!accepted) throw new Error('Could not create document');
            }
            else {
                response.setBody(items[0]);
            }
        });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
海因,关于你的担忧,你可以深入研究这一点,它阐述了宇宙中的酸性物质

在Azure Cosmos DB中,JavaScript运行时托管在数据库中 引擎。因此,在存储过程和 触发器在与数据库会话相同的范围内执行。这 该功能使Azure Cosmos DB能够保证所有用户的ACID属性 作为存储过程或触发器一部分的操作。对于 例子

因此,我认为你的问题的答案是肯定的,因为原子性保证事务中完成的所有操作都被视为一个单独的单元,要么全部提交,要么没有提交

顺便说一句,您也可以在创建集合之前设置一个或多个唯一键,请参阅此