创建一个 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); }
});
}
我想创建一个 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); }
});
}