当 运行 预触发创建时,具有指定 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);
在 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);