创建DocumentDB帖子类型触发器以存储文档编辑历史记录

时间:2016-07-28 18:14:10

标签: triggers azure-cosmosdb

我想创建一个post触发器,以便在有人修改文档时将旧内容保存到另一个文档。我真的没有在互联网上找到很多关于DocumentDB触发器的示例代码,所以我希望我能在这里得到一些帮助......

如果在SQL Server中,我将在UPDATE上创建After触发器并使用Inserted和Deleted临时表来跟踪表修改历史记录。

例如,在SQL中它将是

Insert Into TableToStoreHistory
Select {some columns} From inserted i JOIN deleted d
ON i.id = d.id

我知道在DocumentDB中,java脚本代码将完全不同。我希望自己能先拿出一些代码。但是,我没有找到一个更接近的示例,显示如何在DocumentDB post触发器中执行此操作。

假设我的文件定义如下:

文件A

{
    "id": "1",
    "content": "Hello World!"
}

当有人修改文档A时,我希望将后置触发器写入另一个文档。旧内容将写入文档B,如下所示

{
    "id": {assign some other id maybe "1_date&time"},
    "oldContent": "HelloWorld"
}

有人可以帮忙吗?

非常感谢!

3 个答案:

答案 0 :(得分:0)

我所知道的触发器的最佳讨论和示例可以在这里找到:https://azure.microsoft.com/en-us/documentation/articles/documentdb-programming/

我建议阅读所有内容,但您可以跳到"数据库触发器"看一个例子。

答案 1 :(得分:0)

您可以编写一个Pre-trigger,它接收传入的请求正文并插入如下所示的附加文档

function() {
    var collection = getContext().getCollection();
    var collectionLink = collection.getSelfLink();
    var doc = getContext().getRequest().getBody();

    var ts = new Date();
    var time = ts.getTime().toString();
    var idNew = doc.id + time;
    var newDoc = { id: idNew, oldContent: doc.content };
    collection.createDocument(collection.getSelfLink(), newDoc, function(err, docCreated) {
        if(err) { throw new Error('Error: ' + err.message); } \r\n"
    });
}

此触发器应作为更新请求的一部分运行。

答案 2 :(得分:0)

我通过借用Shireesh的想法来解决这个问题。

要将旧内容保存到另一个文档中,您需要预先触发,并且需要在实际执行Replace操作之前查询文档。以下是我的代码:

function ResourceAuditHistory() {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var doc = getContext().getRequest().getBody();

var ts = new Date();
var time = ts.getTime().toString();
var idNew = doc.id + time;

var Query = 'SELECT * From c Where c.id = "' + doc.id +'"';

var accept = collection.queryDocuments(collection.getSelfLink(), Query, updateMetadataCallback);

function updateMetadataCallback(err, documents, responseOptions) {
    if (err) throw new Error("Error" + err.message);
    if (documents.length != 1) throw 'Unable to find metadata document';

    var oldDoc = documents[0];

    var historyDoc =
        {
            "id": idNew,
            "Content": oldDoc.Content
        };
    collection.createDocument(collectionLink, historyDoc, function (err, docCreated) {
        if (err) { throw new Error('Error: ' + err.message); }
    });

}