如何在插入操作上使用DocumentDB的预触发来批准/拒绝插入

时间:2016-03-13 14:43:32

标签: database triggers azure-cosmosdb

我需要在插入DocumentDB表时创建一个条件。 我使用的是.NET SDK。

当我使用插入操作时,我想将文档与其余文档进行比较,并且只有在特定字段中没有其他文档包含相同值时才批准插入。

其他选项是将列定义为唯一,只有在我的情况下,它是两列应该是唯一的。

这是我所做的触发器,由于某种原因它没有阻止INSERT操作。

要比较的字段是" ApplicationSession"和" OperationCounter"

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


if (!docToCreate.ApplicationSession || docToCreate.ApplicationSession == ""
    || !docToCreate.OperationCounter || docToCreate.OperationCounter == 0) {
    throw new Error('Application session and Counter is a must');
}


var filterQuery = 'SELECT * FROM r WHERE r.ApplicationSession = "'
                      + docToCreate.ApplicationSession + '" AND r.OperationCounter = '
                      + docToCreate.OperationCounter;
collection.queryDocuments(collection.getSelfLink(), filterQuery
   , function (err, docs, options) {
       if (docs.length > 0) {
           throw new Error('Application session and Counter must be unique');
       }
   });}

1 个答案:

答案 0 :(得分:2)

您是否确定在调用CreateDocumentAsync时正在执行触发器?

在DocumentDB中,触发器执行不像您期望的那样自动执行。 这是因为您经常将不同的文档放入单个集合中,并且您可能需要针对不同类型的文档使用不同的触发器。

要在创建文档时执行文档,请确保指定包含触发器,如下所示:

CreateDocumentAsync(coll_link, 
    new {foo: "bar"}, 
    new RequestOptions {IncludePreTrigger = "TriggerName"});