Package Information
Documentation
n8n-nodes-mongoid
π§© A custom node for n8n that allows inserting, updating, and finding MongoDB documents with full control over data types (ObjectId, Date, Number, etc).
π What this node does
This node makes life easier for those working with MongoDB in n8n, allowing you to:
- β Insert documents into MongoDB
- β Update existing documents (with upsert support)
- β Find documents with custom filters
- β Map fields with specific types (ObjectId, Date, Number, String, Boolean, Array, Object)
- β Automatically convert values to the correct MongoDB types
- β Robust validation with clear error messages
- β Expression support for all fields
π¦ Installation
Via npm
npm install n8n-nodes-mongoid
Via yarn
yarn add n8n-nodes-mongoid
After installation, restart n8n so the node appears in the available nodes list as "Mongo Extended".
π§ Configuration
1. MongoDB Credentials
Configure MongoDB credentials securely. You can choose between two methods:
π Recommended Method: Separate Fields (More Secure)
Use this method for better security. Credentials are stored separately and encrypted by n8n.
Configuration:
- Connection Type: Select
Separate Fields - Host: MongoDB server address (e.g.,
cluster1-pri.fzicr.mongodb.net) - Port: MongoDB port (default: 27017, leave empty for MongoDB Atlas)
- User: MongoDB username
- Password: Password (encrypted field) π
- Use SSL/TLS: Enabled (recommended)
- Use SRV: Enabled for MongoDB Atlas
- Additional Options: Extra parameters (e.g.,
retryWrites=true&w=majority) - Database: Database name
Advantages:
- β Password is stored in encrypted field
- β Does not expose credentials in plain text
- β Easier to audit and manage
- β Follows security best practices
β οΈ Alternative Method: Full Connection String
Use only for compatibility or special cases.
Configuration:
- Connection Type: Select
Full Connection String - Connection String: Complete URL (e.g.,
mongodb+srv://user:pass@cluster.mongodb.net) - Database: Database name
Disadvantages:
- β οΈ Username and password are visible in the connection string
- β οΈ Less secure
- β οΈ Makes credential auditing difficult
2. Available Operations
πΉ Operation: Insert
Inserts a new document into the specified collection.
Settings:
- Collection: MongoDB collection name
- Field Mapping: Configure each document field:
- Field Name in MongoDB: Name the field will have in the document (e.g.,
userId,email) - Data Type: Select the type (String, Number, Boolean, ObjectId, Date, Array, Object)
- Value Source: Path to field in input JSON, literal value, or n8n expression
- Field Name in MongoDB: Name the field will have in the document (e.g.,
Example:
If the input item is:
{
"userId": "507f1f77bcf86cd799439011",
"email": "user@example.com",
"age": "25"
}
Configure the mapping:
- Field:
_id| Type:ObjectId| Source:json.userId - Field:
email| Type:String| Source:json.email - Field:
age| Type:Number| Source:json.age
Result in MongoDB:
{
"_id": ObjectId("507f1f77bcf86cd799439011"),
"email": "user@example.com",
"age": 25
}
πΉ Operation: Update
Updates an existing document in the collection.
Additional settings:
- Update Filter: Field used to find the document (e.g.,
_id,email) - Filter Value: Path in input JSON, literal value, or expression
- Filter Type: Filter data type (String, ObjectId, Number)
- Upsert: If enabled, inserts the document if it doesn't exist
Update Example:
Input item:
{
"id": "507f1f77bcf86cd799439011",
"name": "John Silva",
"updatedAt": "2025-01-15T10:30:00Z"
}
Settings:
- Filter:
_id - Filter Value:
json.id(or literal value:507f1f77bcf86cd799439011) - Filter Type:
ObjectId - Upsert:
true
Mapping:
- Field:
name| Type:String| Source:json.name - Field:
updatedAt| Type:Date| Source:json.updatedAt
πΉ Operation: Find
Searches for documents in the collection with custom filters.
Settings:
- Search Filter: Add multiple filters
- Field Name: MongoDB field to filter
- Field Type: Data type (String, Number, Boolean, ObjectId, Date)
- Value: Path in JSON, literal value, or expression
- Sort: Add fields to sort the results
- Field Name: Field to sort by (e.g., createdAt, name, age)
- Order: Ascending (1) or Descending (-1)
- Result Limit: Maximum number of documents (0 = no limit)
- Skip: Number of documents to skip (pagination)
Example 1: Find active users sorted by creation date
Find active users and return the 10 most recent:
Filters:
- Field:
status| Type:String| Value:active
Sort:
- Field:
createdAt| Order:Descending (Z-A, 9-1, most recent)
Limit: 10
Skip: 0
Result: Returns the 10 most recent active users (sorted by creation date, newest to oldest).
Example 2: Find products sorted by price and name
Find all in-stock products, sorted first by price (lowest to highest) and then by name (A-Z):
Filters:
- Field:
inStock| Type:Boolean| Value:true
Sort:
- Field:
price| Order:Ascending (A-Z, 1-9, oldest) - Field:
name| Order:Ascending (A-Z, 1-9, oldest)
Limit: 50
Result: In-stock products sorted by price (cheapest to most expensive), and in case of equal prices, sorted alphabetically by name.
Example 3: Pagination with sorting
Find the second page of posts (10 items per page) sorted by publication date:
Filters: (none - find all)
Sort:
- Field:
publishedAt| Order:Descending (Z-A, 9-1, most recent)
Limit: 10
Skip: 10 β¬
οΈ Skip the first 10 (first page)
Result: Posts 11-20 most recent.
π οΈ Supported Data Types
π String
Converts any value to text.
Examples:
// Literal value
"John Silva"
// JSON path
json.name
// Expression
{{ $json.firstName + ' ' + $json.lastName }}
π’ Number
Converts values to number. Validates if the result is a valid number.
Examples:
// Literal value
25
3.14
// String that will be converted
"42"
// JSON path
json.age
// Expression
{{ $json.quantity * $json.price }}
Error if invalid:
Invalid value for Number for field "age": "abc". Expected a valid number.
β Boolean
Converts values to boolean.
Accepted values:
- Booleans:
true,false - Strings:
"true","false","1","0"(case insensitive) - Numbers:
1(true),0(false), any number other than 0 (true)
Examples:
// Literal value
true
false
// String
"true"
"false"
"1"
"0"
// JSON path
json.isActive
// Expression
{{ $json.age >= 18 }}
{{ true }}
Error if invalid:
Invalid value for Boolean for field "active": "yes". Expected true, false, 1, 0, or expression.
π ObjectId
Converts a 24-character hexadecimal string to MongoDB ObjectId.
Expected format: Hexadecimal string with exactly 24 characters (0-9, a-f, A-F)
Examples:
// Literal value
507f1f77bcf86cd799439011
// JSON path
json.userId
// Expression (not recommended, use direct value)
{{ $json.id }}
Error if invalid:
Invalid value for ObjectId for field "_id": "123". Expected a 24-character hexadecimal string.
π Date
Converts values to MongoDB Date. Accepts various formats.
Accepted formats:
- ISO 8601:
2025-01-15T10:30:00Z,2025-01-15T10:30:00.000Z - Simple date:
2025-01-15,2025/01/15 - Numeric timestamp:
1705318200000 - JavaScript Date object:
new Date()
Examples:
// Literal value (ISO 8601)
2025-01-15T10:30:00Z
2025-01-15
// Timestamp
1705318200000
// JSON path
json.createdAt
// Expression - Current date
{{ new Date() }}
// Expression - Specific date
{{ new Date('2025-01-01') }}
// Expression - Add days
{{ new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) }}
Error if invalid:
Invalid value for Date for field "createdAt": "invalid". Expected ISO 8601 format (e.g., 2024-01-01T12:00:00Z, 2024-01-01, or timestamp).
π Array (auto-converts ObjectIds)
Converts values to array. 24-character hexadecimal strings are automatically converted to ObjectId.
Supports arrays of any type: strings, numbers, objects, dates, etc.
Basic examples:
// Literal JSON value (must be valid)
["item1", "item2", "item3"]
[1, 2, 3]
// JSON path (if already array)
json.tags
// Expression - Direct array
{{ ["tag1", "tag2"] }}
// Expression - Split string
{{ $json.categories.split(',') }}
// Single value (will be converted to array)
"single-value"
// Result: ["single-value"]
Arrays of objects:
// Expression - Array of objects
{{ [
{ id: 1, name: "Item 1", active: true },
{ id: 2, name: "Item 2", active: false }
] }}
// Array of complex objects with dates and ObjectIds
{{ [
{
userId: "507f1f77bcf86cd799439011",
role: "admin",
createdAt: new Date(),
permissions: ["read", "write", "delete"]
},
{
userId: "507f1f77bcf86cd799439012",
role: "user",
createdAt: new Date(),
permissions: ["read"]
}
] }}
// Transform JSON data into array of objects
{{ $json.users.map(u => ({
name: u.fullName,
email: u.email,
active: u.status === 'active'
})) }}
Practical examples:
// Article tags
json.tags
// If json.tags = ["javascript", "nodejs"]
// Result: ["javascript", "nodejs"]
// Categories from comma-separated string
{{ $json.categories.split(',').map(c => c.trim()) }}
// If categories = "tech, programming, tutorial"
// Result: ["tech", "programming", "tutorial"]
// Array of products with calculated prices
{{ $json.items.map(item => ({
productId: item.id,
quantity: item.qty,
totalPrice: item.qty * item.price,
addedAt: new Date()
})) }}
π Array (without ObjectId conversion)
New! Use this type when you DON'T want 24-character strings to be converted to ObjectId.
When to use: When you have IDs that look like ObjectIds but should remain as strings (e.g., external IDs, codes, references).
Examples:
// Array with IDs that should remain strings
{{ [
{ externalId: "507f1f77bcf86cd799439011", provider: "stripe" },
{ externalId: "507f1f77bcf86cd799439012", provider: "paypal" }
] }}
// Result in MongoDB (externalId stays as STRING):
[
{ externalId: "507f1f77bcf86cd799439011", provider: "stripe" },
{ externalId: "507f1f77bcf86cd799439012", provider: "paypal" }
]
// If you used "Array (auto-converts ObjectIds)", the result would be:
[
{ externalId: ObjectId("507f1f77bcf86cd799439011"), provider: "stripe" }, // β Converted!
{ externalId: ObjectId("507f1f77bcf86cd799439012"), provider: "paypal" }
]
π Array of ObjectIds
Special type for arrays containing only MongoDB ObjectIds. Validates that all elements are valid ObjectIds.
Examples:
// Array of IDs as strings (will be converted to ObjectId)
["507f1f77bcf86cd799439011", "507f1f77bcf86cd799439012", "507f1f77bcf86cd799439013"]
// JSON path
json.userIds
// If userIds = ["507f1f77bcf86cd799439011", "507f1f77bcf86cd799439012"]
// Result: [ObjectId("507f1f77bcf86cd799439011"), ObjectId("507f1f77bcf86cd799439012")]
// Expression
{{ $json.collaborators.map(c => c.userId) }}
// If collaborators = [{ userId: "507f1f77bcf86cd799439011" }, { userId: "507f1f77bcf86cd799439012" }]
// Result: [ObjectId("507f1f77bcf86cd799439011"), ObjectId("507f1f77bcf86cd799439012")]
Error if invalid:
Invalid value in ObjectId array for field "members": "123". Expected 24-character hexadecimal string.
π¦ Object (auto-converts ObjectIds)
Converts values to JSON object. 24-character hexadecimal strings within the object are automatically converted to ObjectId.
If already an object, keeps it; if a string, tries to parse as JSON.
Examples:
// Literal JSON value
{"name": "John", "age": 30}
{"address": {"city": "SΓ£o Paulo", "country": "Brazil"}}
// JSON path (if already object)
json.metadata
json.config
// Expression - Direct object
{{ { name: $json.firstName, age: $json.age } }}
// Expression - Build object
{{ {
user: $json.username,
timestamp: new Date(),
data: $json.rawData
} }}
// Valid JSON string (will be parsed)
'{"key": "value"}'
Practical examples:
// User metadata
json.metadata
// If metadata = { "plan": "premium", "verified": true }
// Result: { "plan": "premium", "verified": true }
// Embedded configuration
{{ { theme: "dark", language: $json.lang, notifications: true } }}
// Result: { "theme": "dark", "language": "en-US", "notifications": true }
// Full address
{{ {
street: $json.street,
city: $json.city,
zipCode: $json.zip,
coordinates: { lat: $json.lat, lng: $json.lng }
} }}
Error if invalid:
Invalid value for Object for field "config": "invalid json". Expected a valid JSON object.
π¦ Object (without ObjectId conversion)
New! Use this type when you DON'T want 24-character strings within the object to be converted to ObjectId.
When to use: When you have external IDs, tracking codes, or any string that looks like ObjectId but should remain as string.
Examples:
// Object with external IDs that should remain strings
{{ {
userId: $json.userId,
stripeCustomerId: "507f1f77bcf86cd799439011",
paypalCustomerId: "507f1f77bcf86cd799439012",
metadata: {
trackingCode: "507f1f77bcf86cd799439013"
}
} }}
// Result in MongoDB (IDs remain as STRINGS):
{
userId: ObjectId("..."), // userId from $json can be ObjectId if it already is
stripeCustomerId: "507f1f77bcf86cd799439011", // β
String
paypalCustomerId: "507f1f77bcf86cd799439012", // β
String
metadata: {
trackingCode: "507f1f77bcf86cd799439013" // β
String
}
}
// If you used "Object (auto-converts ObjectIds)":
{
userId: ObjectId("..."),
stripeCustomerId: ObjectId("507f1f77bcf86cd799439011"), // β Converted!
paypalCustomerId: ObjectId("507f1f77bcf86cd799439012"), // β Converted!
metadata: {
trackingCode: ObjectId("507f1f77bcf86cd799439013") // β Converted!
}
}
Use cases:
- External system IDs (Stripe, PayPal, etc.)
- Tracking codes
- External references
- Any identifier that is not from MongoDB
π Update Operators for Arrays
The Update operation has 4 operators to manipulate arrays. See how to use each one step by step in the node.
π $set - Replace values (default)
What it does: Completely replaces the field value (overwrites everything).
When to use: When you want to replace the entire array or substitute a simple value.
π― Practical Example 1: Replace complete tag array
Scenario: You have a post with old tags and want to replace them with new tags.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "My Post",
tags: ["old-tag1", "old-tag2"]
}
Node configuration:
- Operation:
Update - Collection:
posts - Update Filter:
_id - Filter Value:
507f1f77bcf86cd799439011 - Filter Type:
ObjectId - Update Operator:
$setβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
tags - Data Type:
Array - Value Source:
{{ ["react", "typescript", "tutorial"] }}
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "My Post",
tags: ["react", "typescript", "tutorial"] // β
Array replaced
}
π $push - Add item to array
What it does: Adds a new item to the end of the existing array (doesn't remove anything).
When to use: When you want to add comments, history, cart items, etc.
π― Practical Example 2: Add comment to a post
Scenario: User is adding a comment to a post.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "My Post",
comments: [
{ userId: "507f...", text: "First comment", createdAt: ISODate("2025-01-10") }
]
}
Input item in n8n:
{
"postId": "507f1f77bcf86cd799439011",
"userId": "507f1f77bcf86cd799439012",
"commentText": "Great post!"
}
Node configuration:
- Operation:
Update - Collection:
posts - Update Filter:
_id - Filter Value:
json.postId - Filter Type:
ObjectId - Update Operator:
$pushβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
comments - Data Type:
Object - Value Source:
{{ { userId: $json.userId, text: $json.commentText, createdAt: new Date() } }}
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "My Post",
comments: [
{ userId: "507f...", text: "First comment", createdAt: ISODate("2025-01-10") },
{ userId: "507f1f77bcf86cd799439012", text: "Great post!", createdAt: ISODate("2025-01-15") } // β
New comment
]
}
π― Practical Example 3: Add collaborator to a project
Scenario: Add a new collaborator to the project.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
name: "Project ABC",
collaborators: [
ObjectId("507f1f77bcf86cd799439020")
]
}
Node configuration:
- Operation:
Update - Collection:
projects - Update Filter:
_id - Filter Value:
507f1f77bcf86cd799439011 - Filter Type:
ObjectId - Update Operator:
$pushβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
collaborators - Data Type:
ObjectId - Value Source:
507f1f77bcf86cd799439021(orjson.newUserId)
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
name: "Project ABC",
collaborators: [
ObjectId("507f1f77bcf86cd799439020"),
ObjectId("507f1f77bcf86cd799439021") // β
New collaborator
]
}
β οΈ WARNING: $push always adds, even if the item already exists (can duplicate). Use $addToSet to avoid duplicates.
π $addToSet - Add unique item (no duplicates)
What it does: Adds an item to the array only if it doesn't exist yet (doesn't duplicate).
When to use: Tags, categories, group members - anything that shouldn't have duplicates.
π― Practical Example 4: Add tag without duplicating
Scenario: User is adding the "javascript" tag to a post. If it already exists, don't add it again.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "Tutorial",
tags: ["react", "frontend"]
}
Node configuration:
- Operation:
Update - Collection:
posts - Update Filter:
_id - Filter Value:
507f1f77bcf86cd799439011 - Filter Type:
ObjectId - Update Operator:
$addToSetβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
tags - Data Type:
String - Value Source:
javascript
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "Tutorial",
tags: ["react", "frontend", "javascript"] // β
Tag added
}
If run again with the same tag:
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "Tutorial",
tags: ["react", "frontend", "javascript"] // β
No duplicate!
}
π― Practical Example 5: Add member to group (without duplicating)
Scenario: Add user to a group, but only if they're not already a member.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
groupName: "Admins",
members: [
ObjectId("507f1f77bcf86cd799439020")
]
}
Node configuration:
- Operation:
Update - Collection:
groups - Update Filter:
_id - Filter Value:
507f1f77bcf86cd799439011 - Filter Type:
ObjectId - Update Operator:
$addToSetβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
members - Data Type:
ObjectId - Value Source:
507f1f77bcf86cd799439021
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
groupName: "Admins",
members: [
ObjectId("507f1f77bcf86cd799439020"),
ObjectId("507f1f77bcf86cd799439021") // β
Member added
]
}
π $pull - Remove item from array
What it does: Removes all items from the array that match the specified value.
When to use: Remove tags, delete comments, remove collaborators, etc.
π― Practical Example 6: Remove specific tag
Scenario: Remove the "deprecated" tag from a post.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "Old Post",
tags: ["javascript", "deprecated", "tutorial", "deprecated"]
}
Node configuration:
- Operation:
Update - Collection:
posts - Update Filter:
_id - Filter Value:
507f1f77bcf86cd799439011 - Filter Type:
ObjectId - Update Operator:
$pullβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
tags - Data Type:
String - Value Source:
deprecated
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
title: "Old Post",
tags: ["javascript", "tutorial"] // β
All occurrences of "deprecated" removed
}
π― Practical Example 7: Remove collaborator from project
Scenario: Remove a user from the collaborators list.
Document in MongoDB (before):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
name: "Project ABC",
collaborators: [
ObjectId("507f1f77bcf86cd799439020"),
ObjectId("507f1f77bcf86cd799439021"),
ObjectId("507f1f77bcf86cd799439022")
]
}
Input item in n8n:
{
"projectId": "507f1f77bcf86cd799439011",
"userToRemove": "507f1f77bcf86cd799439021"
}
Node configuration:
- Operation:
Update - Collection:
projects - Update Filter:
_id - Filter Value:
json.projectId - Filter Type:
ObjectId - Update Operator:
$pullβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
collaborators - Data Type:
ObjectId - Value Source:
json.userToRemove
- Field Name:
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
name: "Project ABC",
collaborators: [
ObjectId("507f1f77bcf86cd799439020"),
ObjectId("507f1f77bcf86cd799439022") // β
User 021 removed
]
}
π Operator Summary Table
| Operator | What it does | Duplicates? | Example Use |
|---|---|---|---|
| $set | Replaces complete value | N/A | Replace entire tag array |
| $push | Adds to end of array | β Yes | Add comment, history |
| $addToSet | Adds if doesn't exist | β No | Add tag, group member |
| $pull | Removes matching items | N/A | Remove tag, collaborator |
π― Update Specific Field Inside Array (Positional Operator $)
Scenario: You have an array of objects and want to update only one field of a specific object within the array.
π Practical Example: Update resolution for a specific question
Document in MongoDB:
{
_id: ObjectId("507f1f77bcf86cd799439011"),
examId: "exam-123",
questions: [
{
questionId: "q1",
text: "What is the capital of Brazil?",
resolution: null,
points: 10
},
{
questionId: "q2",
text: "What is 2+2?",
resolution: null,
points: 5
}
]
}
Goal: Update the resolution field of the question with questionId: "q1".
Input item in n8n:
{
"examId": "exam-123",
"questionId": "q1",
"resolution": "The capital of Brazil is BrasΓlia"
}
β
Solution: Use array filter + positional operator $
Node configuration:
- Operation:
Update - Collection:
exams - Update Filter:
questions.questionIdβ¬ οΈ Filter by field inside array - Filter Value:
json.questionId - Filter Type:
String - Update Operator:
$setβ¬ οΈ IMPORTANT - Field Mapping:
- Field Name:
questions.$.resolutionβ¬ οΈ Use$to reference the found item - Data Type:
String - Value Source:
json.resolution
- Field Name:
π Explanation of Positional Operator $
questions.questionIdin filter β MongoDB searches inside thequestionsarray for an object wherequestionIdequals the provided valuequestions.$.resolutionin field β The$represents the first element of the array that matched the filter- MongoDB updates only that specific object, not the entire array
Document in MongoDB (after):
{
_id: ObjectId("507f1f77bcf86cd799439011"),
examId: "exam-123",
questions: [
{
questionId: "q1",
text: "What is the capital of Brazil?",
resolution: "The capital of Brazil is BrasΓlia", // β
Updated!
points: 10
},
{
questionId: "q2",
text: "What is 2+2?",
resolution: null, // βͺ Not modified
points: 5
}
]
}
π― Another Example: Update multiple fields of an array item
Scenario: Update resolution and answeredBy for a question.
Input item in n8n:
{
"examId": "exam-123",
"questionId": "q2",
"resolution": "4",
"answeredBy": "507f1f77bcf86cd799439020"
}
Node configuration:
- Operation:
Update - Collection:
exams - Update Filter:
questions.questionId - Filter Value:
json.questionId - Filter Type:
String - Update Operator:
$set - Field Mapping:
- Field 1:
- Field Name:
questions.$.resolution - Data Type:
String - Value Source:
json.resolution
- Field Name:
- Field 2:
- Field Name:
questions.$.answeredBy - Data Type:
ObjectId - Value Source:
json.answeredBy
- Field Name:
- Field 1:
Result:
{
_id: ObjectId("507f1f77bcf86cd799439011"),
examId: "exam-123",
questions: [
{
questionId: "q1",
text: "What is the capital of Brazil?",
resolution: "The capital of Brazil is BrasΓlia",
points: 10
},
{
questionId: "q2",
text: "What is 2+2?",
resolution: "4", // β
Updated!
answeredBy: ObjectId("507f1f77bcf86cd799439020"), // β
Updated!
points: 5
}
]
}
β οΈ Limitations of Positional Operator $
- Updates only the first element that matches the filter
- Doesn't work with nested arrays (use
$[]or$[<identifier>]for more complex cases) - Requires a filter on the array - the
$needs a filter to know which element to update
π‘ Tip: Compound Filters
You can combine filters on the main document + filter on the array:
Configuration:
- Update Filter:
examId - Filter Value:
json.examId - Type:
String
Then add a second filter using field configuration creatively, but the current node only supports one filter. For multiple filters, use the filter in the format:
examId AND questions.questionId
However, in the current node, you can filter directly by questions.questionId which will work.
π‘ Use Cases
1. Insert user with automatic creation date
Mapping:
- Field:
name| Type:String| Source:json.name - Field:
email| Type:String| Source:json.email - Field:
createdAt| Type:Date| Source:{{ new Date() }} - Field:
isActive| Type:Boolean| Source:true
2. Convert IDs from string to ObjectId
When receiving data from external APIs, IDs usually come as strings. This node automatically converts them to ObjectId.
Mapping:
- Field:
userId| Type:ObjectId| Source:json.userId - Field:
institutionId| Type:ObjectId| Source:68e466346a2c77b2cb0cc805
3. Save array of tags
Mapping:
- Field:
title| Type:String| Source:json.title - Field:
tags| Type:Array| Source:{{ $json.categories.split(',') }} - Field:
metadata| Type:Object| Source:{{ { views: 0, likes: 0 } }}
4. Update document with upsert
Use Update with upsert enabled to update if exists or create if doesn't exist:
Filter:
- Field:
_id - Type:
ObjectId - Value:
json.id - Upsert:
β
5. Find documents with multiple filters
Filters:
- Field:
status| Type:String| Value:active - Field:
role| Type:String| Value:admin - Field:
createdAt| Type:Date| Value:{{ new Date('2025-01-01') }}
Limit: 50
6. Add comment to a document
Adds a new comment to a post's comments array.
Operation: Update
Filter: _id | Type: ObjectId | Value: json.postId
Operator: $push
Mapping:
- Field:
comments| Type:Object| Source:{{ { userId: $json.userId, text: $json.comment, createdAt: new Date() } }}
Result:
// Before
{ _id: ObjectId("..."), comments: [] }
// After
{
_id: ObjectId("..."),
comments: [
{ userId: "507f...", text: "Great post!", createdAt: ISODate("2025-01-15...") }
]
}
7. Add collaborator to project (without duplicating)
Adds a user to the collaborators array only if they're not already there.
Operation: Update
Filter: _id | Type: ObjectId | Value: json.projectId
Operator: $addToSet
Mapping:
- Field:
collaborators| Type:ObjectId| Source:json.userId
8. Remove collaborator from project
Removes a specific user from the collaborators array.
Operation: Update
Filter: _id | Type: ObjectId | Value: json.projectId
Operator: $pull
Mapping:
- Field:
collaborators| Type:ObjectId| Source:json.userIdToRemove
9. Save status history
Adds status change record to the document's history.
Operation: Update
Filter: _id | Type: ObjectId | Value: json.orderId
Operator: $push
Mapping:
- Field:
statusHistory| Type:Object| Source:{{ { status: $json.newStatus, changedBy: $json.userId, changedAt: new Date(), notes: $json.notes } }}
Result:
{
_id: ObjectId("..."),
statusHistory: [
{ status: "pending", changedBy: "user1", changedAt: ISODate("..."), notes: "Order created" },
{ status: "processing", changedBy: "user2", changedAt: ISODate("..."), notes: "Started processing" },
{ status: "completed", changedBy: "user2", changedAt: ISODate("..."), notes: "Order completed" }
]
}
10. Manage product array in cart
Insert cart with products:
Operation: Insert
Mapping:
- Field:
userId| Type:ObjectId| Source:json.userId - Field:
items| Type:Array| Source:{{ $json.products.map(p => ({ productId: p.id, quantity: p.qty, price: p.price, addedAt: new Date() })) }} - Field:
createdAt| Type:Date| Source:{{ new Date() }}
Add product to existing cart:
Operation: Update
Filter: userId | Type: ObjectId | Value: json.userId
Operator: $push
Mapping:
- Field:
items| Type:Object| Source:{{ { productId: $json.productId, quantity: $json.quantity, price: $json.price, addedAt: new Date() } }}
π Important Tips
β Literal Values vs JSON Paths vs Expressions
Literal Value:
507f1f77bcf86cd799439011
true
2025-01-15
JSON Path:
json.userId
json.data.email
json.metadata.createdAt
n8n Expression:
{{ new Date() }}
{{ $json.age >= 18 }}
{{ $json.firstName + ' ' + $json.lastName }}
The node automatically detects which type you're using!
β Error Validation
All validations return clear messages indicating:
- Which field had an error
- Which value was provided
- Which format is expected
- Examples of valid values
β Null Values
Fields with null or undefined are ignored and don't appear in the final MongoDB document.
π Troubleshooting
Error: "path.split is not a function"
This occurred in old versions when using expressions like {{ new Date() }}. Current version resolves automatically.
Error: "Invalid value for ObjectId"
Make sure the ObjectId has exactly 24 hexadecimal characters (0-9, a-f).
Error: "Invalid value for Date"
Use ISO 8601 formats (2025-01-15T10:30:00Z) or expressions ({{ new Date() }}).
Update doesn't find document
Verify that:
- The filter is correct
- The filter type matches the field type in MongoDB
- The filter value exists in the input item
π License
MIT
π€ Contributing
Contributions are welcome! Open an issue or pull request in the repository.
