创建一个 DocumentDB post 类型的触发器来存储文档编辑历史

Create a DocumentDB post type trigger to store document edit history

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

如果在 SQL 服务器中,我会在 UPDATE 上创建一个 After 触发器,并使用 Inserted 和 Deleted temp tables 来跟踪 table 修改历史。

例如,在 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!"
}

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

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

有人可以帮忙吗?

非常感谢!

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

我建议全部阅读,但您可以跳到 "Database Triggers" 部分查看示例。

您可以编写一个预触发器来获取传入的请求正文并插入附加文档,如下所示

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"
    });
}

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

我借用了 Shireesh 的想法解决了这个问题。

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

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); }
    });

}