mirror of
https://github.com/n8n-io/n8n.git
synced 2025-01-11 12:57:29 -08:00
⚡ Add "Date Fields" parameter to the insert & update operations (#1529)
MongoDB
This commit is contained in:
commit
3d5a81c1f1
|
@ -1,14 +1,26 @@
|
||||||
import { IExecuteFunctions } from 'n8n-core';
|
import {
|
||||||
|
IExecuteFunctions,
|
||||||
|
} from 'n8n-core';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
IDataObject,
|
IDataObject,
|
||||||
INodeExecutionData,
|
INodeExecutionData,
|
||||||
INodeType,
|
INodeType,
|
||||||
INodeTypeDescription
|
INodeTypeDescription
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { nodeDescription } from './mongo.node.options';
|
|
||||||
import { MongoClient } from 'mongodb';
|
import {
|
||||||
|
nodeDescription,
|
||||||
|
} from './mongo.node.options';
|
||||||
|
|
||||||
|
import {
|
||||||
|
MongoClient,
|
||||||
|
ObjectID,
|
||||||
|
} from 'mongodb';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
getItemCopy,
|
getItemCopy,
|
||||||
|
handleDateFields,
|
||||||
validateAndResolveMongoCredentials
|
validateAndResolveMongoCredentials
|
||||||
} from './mongo.node.utils';
|
} from './mongo.node.utils';
|
||||||
|
|
||||||
|
@ -65,8 +77,13 @@ export class MongoDb implements INodeType {
|
||||||
.map(f => f.trim())
|
.map(f => f.trim())
|
||||||
.filter(f => !!f);
|
.filter(f => !!f);
|
||||||
|
|
||||||
|
const options = this.getNodeParameter('options', 0) as IDataObject;
|
||||||
const insertItems = getItemCopy(items, fields);
|
const insertItems = getItemCopy(items, fields);
|
||||||
|
|
||||||
|
if (options.dateFields) {
|
||||||
|
handleDateFields(insertItems, options.dateFields as string);
|
||||||
|
}
|
||||||
|
|
||||||
const { insertedIds } = await mdb
|
const { insertedIds } = await mdb
|
||||||
.collection(this.getNodeParameter('collection', 0) as string)
|
.collection(this.getNodeParameter('collection', 0) as string)
|
||||||
.insertMany(insertItems);
|
.insertMany(insertItems);
|
||||||
|
@ -90,6 +107,8 @@ export class MongoDb implements INodeType {
|
||||||
.map(f => f.trim())
|
.map(f => f.trim())
|
||||||
.filter(f => !!f);
|
.filter(f => !!f);
|
||||||
|
|
||||||
|
const options = this.getNodeParameter('options', 0) as IDataObject;
|
||||||
|
|
||||||
let updateKey = this.getNodeParameter('updateKey', 0) as string;
|
let updateKey = this.getNodeParameter('updateKey', 0) as string;
|
||||||
updateKey = updateKey.trim();
|
updateKey = updateKey.trim();
|
||||||
|
|
||||||
|
@ -100,19 +119,25 @@ export class MongoDb implements INodeType {
|
||||||
// Prepare the data to update and copy it to be returned
|
// Prepare the data to update and copy it to be returned
|
||||||
const updateItems = getItemCopy(items, fields);
|
const updateItems = getItemCopy(items, fields);
|
||||||
|
|
||||||
|
if (options.dateFields) {
|
||||||
|
handleDateFields(updateItems, options.dateFields as string);
|
||||||
|
}
|
||||||
|
|
||||||
for (const item of updateItems) {
|
for (const item of updateItems) {
|
||||||
if (item[updateKey] === undefined) {
|
if (item[updateKey] === undefined) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
const filter: { [key: string]: string } = {};
|
const filter: { [key: string]: string | ObjectID } = {};
|
||||||
filter[updateKey] = item[updateKey] as string;
|
filter[updateKey] = item[updateKey] as string;
|
||||||
|
if (updateKey === '_id') {
|
||||||
|
filter[updateKey] = new ObjectID(filter[updateKey]);
|
||||||
|
delete item['_id'];
|
||||||
|
}
|
||||||
await mdb
|
await mdb
|
||||||
.collection(this.getNodeParameter('collection', 0) as string)
|
.collection(this.getNodeParameter('collection', 0) as string)
|
||||||
.updateOne(filter, { $set: item });
|
.updateOne(filter, { $set: item });
|
||||||
}
|
}
|
||||||
|
|
||||||
returnItems = this.helpers.returnJsonArray(updateItems as IDataObject[]);
|
returnItems = this.helpers.returnJsonArray(updateItems as IDataObject[]);
|
||||||
} else {
|
} else {
|
||||||
throw new Error(`The operation "${operation}" is not supported!`);
|
throw new Error(`The operation "${operation}" is not supported!`);
|
||||||
|
|
|
@ -1,4 +1,6 @@
|
||||||
import { INodeTypeDescription } from 'n8n-workflow';
|
import {
|
||||||
|
INodeTypeDescription,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Options to be displayed
|
* Options to be displayed
|
||||||
|
@ -6,7 +8,7 @@ import { INodeTypeDescription } from 'n8n-workflow';
|
||||||
export const nodeDescription: INodeTypeDescription = {
|
export const nodeDescription: INodeTypeDescription = {
|
||||||
displayName: 'MongoDB',
|
displayName: 'MongoDB',
|
||||||
name: 'mongoDb',
|
name: 'mongoDb',
|
||||||
icon: 'file:mongoDb.png',
|
icon: 'file:mongodb.svg',
|
||||||
group: ['input'],
|
group: ['input'],
|
||||||
version: 1,
|
version: 1,
|
||||||
description: 'Find, insert and update documents in MongoDB.',
|
description: 'Find, insert and update documents in MongoDB.',
|
||||||
|
@ -46,7 +48,7 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
{
|
{
|
||||||
name: 'Update',
|
name: 'Update',
|
||||||
value: 'update',
|
value: 'update',
|
||||||
description: 'Updates documents.',
|
description: 'Update documents.',
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
default: 'find',
|
default: 'find',
|
||||||
|
@ -97,7 +99,9 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
},
|
},
|
||||||
displayOptions: {
|
displayOptions: {
|
||||||
show: {
|
show: {
|
||||||
operation: ['find'],
|
operation: [
|
||||||
|
'find',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
default: '{}',
|
default: '{}',
|
||||||
|
@ -115,7 +119,9 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
displayOptions: {
|
displayOptions: {
|
||||||
show: {
|
show: {
|
||||||
operation: ['insert'],
|
operation: [
|
||||||
|
'insert',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
default: '',
|
default: '',
|
||||||
|
@ -133,7 +139,9 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
displayOptions: {
|
displayOptions: {
|
||||||
show: {
|
show: {
|
||||||
operation: ['update'],
|
operation: [
|
||||||
|
'update',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
default: 'id',
|
default: 'id',
|
||||||
|
@ -147,7 +155,9 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
displayOptions: {
|
displayOptions: {
|
||||||
show: {
|
show: {
|
||||||
operation: ['update'],
|
operation: [
|
||||||
|
'update',
|
||||||
|
],
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
default: '',
|
default: '',
|
||||||
|
@ -155,5 +165,29 @@ export const nodeDescription: INodeTypeDescription = {
|
||||||
description:
|
description:
|
||||||
'Comma separated list of the fields to be included into the new document.',
|
'Comma separated list of the fields to be included into the new document.',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
displayName: 'Options',
|
||||||
|
name: 'options',
|
||||||
|
type: 'collection',
|
||||||
|
displayOptions: {
|
||||||
|
show: {
|
||||||
|
operation: [
|
||||||
|
'update',
|
||||||
|
'insert',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
placeholder: 'Add Option',
|
||||||
|
default: {},
|
||||||
|
options: [
|
||||||
|
{
|
||||||
|
displayName: 'Date Fields',
|
||||||
|
name: 'dateFields',
|
||||||
|
type: 'string',
|
||||||
|
default: '',
|
||||||
|
description: 'Comma separeted list of fields that will be parse as Mongo Date type.',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
|
@ -102,3 +102,14 @@ export function getItemCopy(
|
||||||
return newItem;
|
return newItem;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function handleDateFields(insertItems: IDataObject[], fields: string) {
|
||||||
|
const dateFields = (fields as string).split(',');
|
||||||
|
for (let i = 0; i < insertItems.length; i++) {
|
||||||
|
for (const key of Object.keys(insertItems[i])) {
|
||||||
|
if (dateFields.includes(key)) {
|
||||||
|
insertItems[i][key] = new Date(insertItems[i][key] as string);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 1,018 B |
1
packages/nodes-base/nodes/MongoDb/mongodb.svg
Normal file
1
packages/nodes-base/nodes/MongoDb/mongodb.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg height="64" viewBox="0 0 32 32" width="64" xmlns="http://www.w3.org/2000/svg"><path d="m15.9.087.854 1.604c.192.296.4.558.645.802.715.715 1.394 1.464 2.004 2.266 1.447 1.9 2.423 4.01 3.12 6.292.418 1.394.645 2.824.662 4.27.07 4.323-1.412 8.035-4.4 11.12-.488.488-1.01.94-1.57 1.342-.296 0-.436-.227-.558-.436-.227-.383-.366-.82-.436-1.255-.105-.523-.174-1.046-.14-1.586v-.244c-.024-.052-.285-24.052-.181-24.175z" fill="#599636"/><path d="m15.9.034c-.035-.07-.07-.017-.105.017.017.35-.105.662-.296.96-.21.296-.488.523-.767.767-1.55 1.342-2.77 2.963-3.747 4.776-1.3 2.44-1.97 5.055-2.16 7.808-.087.993.314 4.497.627 5.508.854 2.684 2.388 4.933 4.375 6.885.488.47 1.01.906 1.55 1.325.157 0 .174-.14.21-.244a4.78 4.78 0 0 0 .157-.68l.35-2.614z" fill="#6cac48"/><path d="m16.754 28.845c.035-.4.227-.732.436-1.063-.21-.087-.366-.26-.488-.453-.105-.174-.192-.383-.26-.575-.244-.732-.296-1.5-.366-2.248v-.453c-.087.07-.105.662-.105.75a17.37 17.37 0 0 1 -.314 2.353c-.052.314-.087.627-.28.906 0 .035 0 .07.017.122.314.924.4 1.865.453 2.824v.35c0 .418-.017.33.33.47.14.052.296.07.436.174.105 0 .122-.087.122-.157l-.052-.575v-1.604c-.017-.28.035-.558.07-.82z" fill="#c2bfbf"/></svg>
|
After Width: | Height: | Size: 1.1 KiB |
Loading…
Reference in a new issue