2016-07-28 17 views
0

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

如果在SQL Server中,我会在UPDATE上创建一个After触发器,并使用Inserted和删除临时表以跟踪表修改历史记录。

例如,在SQL这将是

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

我知道DocumentDB,该Java脚本代码将是完全不同的。我希望自己能够首先想出一些代码。但是,我没有发现一个更接近的例子,展示了如何在DocumentDB后触发器中执行此操作。

比方说,我的文档一样,定义如下:

文件A

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

而且我想要的后触发写入到另一个文档时,有人修改文档A.旧的内容将被写入到文件B也许像下面

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

谁能帮助吗?

非常感谢!

回答

0

我通过借用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); } 
    }); 

} 
0

你可以写一个预触发,是以传入的请求主体和插件像下面

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

这触发所示的附加文件应作为更新请求的一部分运行。

+0

谢谢你的想法。您的方法是将新内容保存到另一个文档,因为doc = getContenxt()。getRequest()。getBody始终是要写入DocDB的内容。但是,我想保存旧内容。你给了我如何解决我的问题的想法。我将在下面发布我的解决方案。谢谢! –

相关问题