2016-07-28 2 views
0

Я хочу создать триггер сообщения, чтобы сохранить старый контент в другом документе, когда кто-то изменяет документ. Я действительно не нашел много примеров кода о триггерах DocumentDB в Интернете, поэтому надеюсь, что смогу получить помощь здесь ...
Создайте триггер типа сообщенияDDD для хранения истории редактирования документа

Если на SQL Server я создавал триггер After после UPDATE и использовал Inserted и Удаленные временные таблицы для отслеживания истории изменений таблицы.

Например, в SQL было бы

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

Я знаю, что в DocumentDB, код Java Script будет совершенно другим. Хотелось бы, чтобы я сам придумал какой-то код. Тем не менее, я не нашел более подробный пример, показывающий, как это сделать в триггере postDocumentDDD.

Скажем, мой документ определяется как показано ниже:

Документ A

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

И я хочу, чтобы после запуска записи в другой документ, когда кто-то изменить документ A. Старое содержимое будет написано в документе B, может быть, как показано ниже

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

Может кто-нибудь помочь, пожалуйста?

спасибо!

ответ

0

Я понял это, заимствуя идею Ширеша.

Чтобы сохранить старый контент в другом документе, вам нужен предварительный запуск, и вам нужно запросить документ до того, как произойдет действие 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); } 
    }); 

} 
0

Вы можете написать Pre-триггер, который принимает поступающую тело запроса и вставить дополнительный документ, как показано ниже

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. Однако я хочу сохранить старый контент. Вы дали мне идею, как решить мою проблему. Я отправлю свое решение ниже. Благодаря! –

Смежные вопросы