mirror of
https://github.com/Mastermindzh/examples.git
synced 2024-11-24 17:02:05 +01:00
added get-json-with-all-fields-recursively.js
This commit is contained in:
parent
16953bd936
commit
2c7822fb0e
@ -37,8 +37,8 @@ It also consolidates all relevant examples in 1 place
|
||||
|
||||
├── mongo
|
||||
│ ├── add-field-with-default-value.js # add a field to an existing collection with a default value
|
||||
│ └── collectionNames-and-count.js # return a list of collections in a database with the number of documents in them
|
||||
|
||||
│ ├── collectionNames-and-count.js # return a list of collections in a database with the number of documents in them
|
||||
│ └── get-json-with-all-fields-recursively.js # returns a single object containing all different (nested) keys from all documents in a collection
|
||||
├── typescript
|
||||
│ ├── datetime
|
||||
│ │ └── getCustomIsoString.ts # function to return a valid ISO string from a given date object
|
||||
|
141
mongo/get-json-with-all-fields-recursively.js
Normal file
141
mongo/get-json-with-all-fields-recursively.js
Normal file
@ -0,0 +1,141 @@
|
||||
// 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"
|
||||
// }
|
Loading…
Reference in New Issue
Block a user