-
Notifications
You must be signed in to change notification settings - Fork 0
/
jsdiff2mongo.js
79 lines (58 loc) · 1.75 KB
/
jsdiff2mongo.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/* global _, jsDiff2Mongo:true */
jsDiff2Mongo = function (objBefore, objAfter) {
"use strict";
if (!objBefore || !objAfter || !objBefore._id || !objAfter._id) {
throw new Error("at least one object doesn't have _id");
}
if (objAfter._id !== objBefore._id){
throw new Error("the two objects have different _id");
}
//objBefore = JSON.parse(JSON.stringify(objBefore));
//objAfter = JSON.parse(JSON.stringify(objAfter));
var akeys = Object.keys(objBefore);
var bkeys = Object.keys(objAfter);
akeys = _.without(akeys, "_id");
bkeys = _.without(bkeys, "_id");
akeys = akeys.filter(function(key){
return !_.isFunction(objBefore[key]);
});
bkeys = bkeys.filter(function(key){
return !_.isFunction(objAfter[key]);
});
var keysToUnset = _.difference(akeys, bkeys);
var keysToSet = _.difference(bkeys, akeys);
var keysInBoth = _.intersection(akeys, bkeys);
var unsetCommandObj = {};
keysToUnset.map(function (key) {
unsetCommandObj[key] = "";
});
var setCommandObj = {};
keysToSet.map(function (key) {
setCommandObj[key] = objAfter[key];
});
var modifiedKeys = [];
keysInBoth.map(function (key) {
if (!_.isEqual(objBefore[key], objAfter[key])) {
modifiedKeys.push(key);
}
});
modifiedKeys.map(function (key) {
setCommandObj[key] = objAfter[key];
});
var selector = {_id: objAfter._id};
var updateObj = {};
if (Object.keys(unsetCommandObj).length > 0) {
updateObj.$unset = unsetCommandObj;
}
if (Object.keys(setCommandObj).length > 0) {
updateObj.$set = setCommandObj;
}
//result is an array
var mongoArr;
if (updateObj && Object.keys(updateObj).length > 0) {
mongoArr = [selector, updateObj];
} else {
mongoArr = [];
}
return mongoArr;
};