examples/mongo/get-json-with-all-fields-recursively.js

142 lines
2.9 KiB
JavaScript

// This script will allow you to take an existing mongo collection
// with many documents that are all partials of a common schema
// and merge them together into a single instance, giving you a json schema
// check whether value is an object
function isObject(value) {
return value && typeof value === "object";
}
function mergeDeep(...objects) {
return objects.reduce((target, source) => {
Object.keys(source).forEach((key) => {
const targetKey = target[key];
const sourceKey = source[key];
if (Array.isArray(sourceKey)) {
if (!Array.isArray(targetKey)) {
target[key] = [];
}
// if array contains object
if (isObject(sourceKey[0])) {
if (!target[key][0]) {
target[key] = [{}];
}
var reduced = sourceKey.reduce((oldObject, newObject) => {
return mergeDeep(oldObject, newObject);
});
target[key] = [mergeDeep(target[key][0], reduced)];
} else {
// keep a single value
target[key] = sourceKey.length > 1 ? sourceKey[0] : sourceKey;
}
} else if (isObject(targetKey) && isObject(sourceKey)) {
target[key] = mergeDeep(targetKey, sourceKey);
} else {
target[key] = sourceKey;
}
});
return target;
}, {});
}
var dataStructure = {};
db.getCollection("test")
.find({})
.forEach(function (doc) {
dataStructure = mergeDeep(dataStructure, doc);
});
JSON.stringify(mergeDeep(dataStructure, { _id: "uniqueId" }), null, 2);
// EXAMPLE
// example input:
/* 1 */
// {
// "_id" : ObjectId("60f00f55a142cf9637dd62f9"),
// "complicatedArray" : [
// {
// "a" : "a"
// }
// ]
// }
// /* 2 */
// {
// "_id" : ObjectId("60f00f5ea142cf9637dd630e"),
// "complicatedArray" : [
// {
// "b" : "b"
// },
// {
// "c" : "c"
// }
// ]
// }
// /* 3 */
// {
// "_id" : ObjectId("60f01664a142cf9637dd654d"),
// "complicatedArray" : [
// {
// "b" : "b"
// },
// {
// "anotherNest" : {
// "d" : "d",
// "more nesting" : {
// "e" : "test"
// }
// }
// }
// ]
// }
// /* 4 */
// {
// "_id" : ObjectId("60f02995a142cf9637dd6b08"),
// "complicatedArray" : [
// {
// "anotherNest" : {
// "f" : "f"
// }
// }
// ],
// "simpleArray" : [
// 0,
// 6,
// 7,
// 4
// ],
// "simpleArray2" : [
// "string",
// "string2"
// ]
// }
// outputs
// {
// "_id": "uniqueId",
// "complicatedArray": [
// {
// "a": "a",
// "b": "b",
// "c": "c",
// "anotherNest": {
// "d": "d",
// "more nesting": {
// "e": "test"
// },
// "f": "f"
// }
// }
// ],
// "simpleArray": 0,
// "simpleArray2": "string"
// }