Вы должны будете вести журнал изменений. Таким образом, клиентский запрос, с которым работает ваше серверное приложение (nodejs), должен быть преобразован в действия db, которые оба регистрируют изменение (как отмена журнала) и выполняют его в одной транзакции.
Затем реализуйте логику, чтобы очистить журнал отмены при необходимости, извлечь действие из этого журнала и выполнить обратное действие, ... и т. Д.
Запись в таком журнале отмены будет содержать от 3 до 4 элементов:
- действие: «обновить», «вставить» или «удалить». Последние два в основном предназначены для представления манипуляций с массивами.
- путь, чтобы определить, где в объекте должно применяться изменение. Этот путь будет массивом свойств, которые, например, могут быть закодированы как строка, разделенная точками.
- старое значение в этом месте (в случае «обновления» или «удаления»), закодировано в JSON.
- новое значение в этом месте (в случае «обновления» или «вставки»"), Закодировано в JSON.
Примеры таких записей:
("update", "cart.products.0.name", '"Watch"', '"Watching"')
("delete", "cart.products.prices.1", '{"currency":"GBP","price":220}', null)
: это представляет действие, в котором старое значениеудаляется из индекса 1 массива prices
. Пробел заполняется смещением значений массива, подобно операции splice(index, 1)
в JavaScript. ("insert", "cart.products.prices.0", null, '{"currency":"EUR","price":270}')
: это представляет действие, в котором новое значение вставляется в индекс 0 в массиве prices
. Если этот индекс уже имеет значение, он смещается вправо, как операция splice(index, 0, newvalue)
в JavaScript.
Значения null
просто указывают, что этот параметр не имеет отношения к данному конкретному действию.
В приведенном выше примере журнала будут собраны следующие данные, начиная с приведенных вами примеров:
{
cart:{
products:[
{
name: "Watching",
quantity: 1,
shippingDate: 123456782,
text: "lorem ipsum....",
prices:[
{
currency: "EUR",
price: 270
},
{
currency: "USD",
price: 300
}
]
}
]
}
}
Такой журнал, как все для отмены действия: если данные былиуничтожен («обновить», «удалить»), вы можете восстановить уничтоженные данные из третьего параметра.