当 运行 预触发创建时,具有指定 ID 的 DocumentDB 资源已经存在

DocumentDB resource with specified id already exists when running a pre-trigger on create

在 DocumentDB 中,我在创建操作上创建了一个预触发器。触发代码如下

function createBlock() {
    var collection = getContext().getCollection();
    var request = getContext().getRequest();
    var docToCreate = request.getBody();

    if (docToCreate.DocumentType)
    {
        var query = "SELECT TOP 1 a.BlockSequence FROM a ORDER BY a.BlockSequence DESC";

        var isAccepted = collection.queryDocuments(collection.getSelfLink(), query, function (err, feed, options) {
            if (err)
                throw err;

            if (!feed)
                throw new Error("Failed to find the document.");

            if (feed.length)
            {
                docToCreate.BlockCode += (feed[0].BlockSequence + 1);
                docToCreate.BlockSequence = feed[0].BlockSequence + 1;
            }
            else
            {
                docToCreate.BlockCode += "1";
                docToCreate.BlockSequence = 1;
            }

            var isAccepted = collection.createDocument(collection.getSelfLink(), docToCreate);

            if (!isAccepted)
                throw new Error("The call createDocument returned false.");  
        });
    }
    else
        throw new Error("DocumentType property is required.");

    if (!isAccepted)
        throw new Error("The call queryDocuments returned false.");
}

触发器执行到 var isAccepted = collection.createDocument(collection.getSelfLink(), docToCreate);.

正上方的行

执行var isAccepted = collection.createDocument(collection.getSelfLink(), docToCreate);时,抛出此错误Message: {"Errors":["Resource with specified id or name already exists"]}

我已经检查过,没有与新文档具有相同 ID 的文档存储到此集合中。

您不应尝试在触发器中进行写入。您应该简单地修改主体或抛出错误。在修改正文时,您更改了创建的文档。在抛出错误时,您将中止操作。

所以代替:

var isAccepted = collection.createDocument(collection.getSelfLink(), docToCreate);

做:

return request.setBody(docToCreate);