feat: Add support for extended JSON in mongo node

This commit is contained in:
Juan David 2025-01-12 22:00:58 +03:00
parent c6b491cdbb
commit 947c2ac98d
2 changed files with 13 additions and 3 deletions

View file

@ -1,3 +1,4 @@
import {EJSON} from 'bson';
import get from 'lodash/get'; import get from 'lodash/get';
import set from 'lodash/set'; import set from 'lodash/set';
import { MongoClient, ObjectId } from 'mongodb'; import { MongoClient, ObjectId } from 'mongodb';
@ -145,6 +146,10 @@ export function stringifyObjectIDs(items: INodeExecutionData[]) {
return items; return items;
} }
export function parseJsonToEjson(query: unknown) {
return EJSON.parse(JSON.stringify(query)) as Record<string, unknown>
}
export async function connectMongoClient(connectionString: string, credentials: IDataObject = {}) { export async function connectMongoClient(connectionString: string, credentials: IDataObject = {}) {
let client: MongoClient; let client: MongoClient;

View file

@ -21,6 +21,7 @@ import type {
import { import {
buildParameterizedConnString, buildParameterizedConnString,
connectMongoClient, connectMongoClient,
parseJsonToEjson,
prepareFields, prepareFields,
prepareItems, prepareItems,
stringifyObjectIDs, stringifyObjectIDs,
@ -134,7 +135,7 @@ export class MongoDb implements INodeType {
const query = mdb const query = mdb
.collection(this.getNodeParameter('collection', i) as string) .collection(this.getNodeParameter('collection', i) as string)
.aggregate(queryParameter as unknown as Document[]); .aggregate(parseJsonToEjson(queryParameter) as unknown as Document[]);
for (const entry of await query.toArray()) { for (const entry of await query.toArray()) {
returnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] }); returnData.push({ json: entry, pairedItem: fallbackPairedItems ?? [{ item: i }] });
@ -155,9 +156,13 @@ export class MongoDb implements INodeType {
if (operation === 'delete') { if (operation === 'delete') {
for (let i = 0; i < itemsLength; i++) { for (let i = 0; i < itemsLength; i++) {
try { try {
const queryParameter = JSON.parse(
this.getNodeParameter('query', i) as string,
) as IDataObject;
const { deletedCount } = await mdb const { deletedCount } = await mdb
.collection(this.getNodeParameter('collection', i) as string) .collection(this.getNodeParameter('collection', i) as string)
.deleteMany(JSON.parse(this.getNodeParameter('query', i) as string) as Document); .deleteMany(parseJsonToEjson(queryParameter) as unknown as Document);
returnData.push({ returnData.push({
json: { deletedCount }, json: { deletedCount },
@ -189,7 +194,7 @@ export class MongoDb implements INodeType {
let query = mdb let query = mdb
.collection(this.getNodeParameter('collection', i) as string) .collection(this.getNodeParameter('collection', i) as string)
.find(queryParameter as unknown as Document); .find(parseJsonToEjson(queryParameter) as unknown as Document);
const options = this.getNodeParameter('options', i); const options = this.getNodeParameter('options', i);
const limit = options.limit as number; const limit = options.limit as number;