MongoDB Compatibility Guide
Overview
This guide documents MongoDB compatibility issues and fixes for Wekan across MongoDB versions 3.0 through 8.0, ensuring proper operation with Meteor.js 2.14.
Current Status
- Meteor.js Version: 2.14
- MongoDB Package: mongo@1.16.8
- Supported MongoDB Versions: 3.0 - 8.0
- Compatibility Status: ✅ Fixed
Compatibility Issues Fixed
1. Deprecated .count()
Method
Issue: The .count()
method is deprecated in newer MongoDB versions.
Fixed Files:
models/users.js
- Line 1839
server/migrations.js
- Line 209
server/publications/cards.js
- Lines 709, 711, 713
client/components/settings/adminReports.js
- Line 115
Fix Applied:
// Before (deprecated)
const count = collection.find().count();
// After (compatible)
const count = collection.find().countDocuments();
2. MongoDB 8.0 Null/Undefined Equality
Issue: MongoDB 8.0 changed behavior where equality matches to null
no longer match undefined
values.
Fixed Files:
models/customFields.js
- Custom field initialization
models/cards.js
- Card custom field initialization
Fix Applied:
// Before (MongoDB 8.0 incompatible)
{ field: null }
// After (MongoDB 8.0 compatible)
{ field: { $in: [null, undefined] } }
Direct Operations Analysis
Purpose of Direct Operations
Direct operations (.direct.insert()
, .direct.update()
, .direct.remove()
) are used intentionally in Wekan to:
- Bypass Meteor Security: For system operations that need to bypass validation
- Migration Scripts: For data migration operations
- Import/Export: For bulk data operations
- System Initialization: For setting up initial data
Files Using Direct Operations
Models:
models/wekanCreator.js
- Wekan board creation
models/trelloCreator.js
- Trello import
models/cards.js
- Card operations
models/boards.js
- Board operations
models/lists.js
- List operations
models/swimlanes.js
- Swimlane operations
models/customFields.js
- Custom field operations
models/checklistItems.js
- Checklist operations
models/integrations.js
- Integration operations
models/csvCreator.js
- CSV export operations
Server:
server/migrations.js
- Database migrations
server/notifications/outgoing.js
- Notification operations
Security Considerations
Direct operations bypass Meteor's security model, so they should only be used when:
- ✅ System-level operations (migrations, imports)
- ✅ Bulk operations that need performance
- ✅ Operations that need to bypass validation
- ❌ User-initiated operations (use regular methods)
- ❌ Operations that need security validation
Raw Collection Usage
Purpose of Raw Collections
Raw collections (.rawCollection()
) are used for:
- Advanced Aggregation: Complex aggregation pipelines
- Database Commands: Direct database commands
- Index Management: Creating/dropping indexes
- Migration Operations: Complex data transformations
Files Using Raw Collections
models/server/metrics.js
- Metrics aggregation
server/migrations.js
- Migration operations
Security Considerations
Raw collections bypass all Meteor security, so they should only be used when:
- ✅ Server-side only operations
- ✅ System administration tasks
- ✅ Complex aggregation pipelines
- ❌ Client-side operations
- ❌ User data operations without validation
Version-Specific Compatibility
MongoDB 3.0 - 3.6
- ✅ Full compatibility
- ✅ Uses mongodb3legacy driver
- ✅ All operations supported
MongoDB 4.0 - 4.4
- ✅ Full compatibility
- ✅ Uses mongodb4legacy driver
- ✅ All operations supported
MongoDB 5.0
- ✅ Full compatibility
- ✅ Uses mongodb5legacy driver
- ✅ All operations supported
MongoDB 6.0
- ✅ Full compatibility
- ✅ Uses mongodb6legacy driver
- ✅ All operations supported
MongoDB 7.0
- ✅ Full compatibility
- ✅ Uses mongodb7legacy driver
- ✅ All operations supported
MongoDB 8.0
- ✅ Full compatibility (after fixes)
- ✅ Uses mongodb8legacy driver
- ✅ Null/undefined equality fixed
Testing Recommendations
Test Matrix
MongoDB Version |
Driver |
Status |
Test Priority |
3.0 |
mongodb3legacy |
✅ Compatible |
High |
3.2 |
mongodb3legacy |
✅ Compatible |
High |
3.4 |
mongodb3legacy |
✅ Compatible |
High |
3.6 |
mongodb3legacy |
✅ Compatible |
High |
4.0 |
mongodb4legacy |
✅ Compatible |
High |
4.2 |
mongodb4legacy |
✅ Compatible |
High |
4.4 |
mongodb4legacy |
✅ Compatible |
High |
5.0 |
mongodb5legacy |
✅ Compatible |
Medium |
6.0 |
mongodb6legacy |
✅ Compatible |
Medium |
7.0 |
mongodb7legacy |
✅ Compatible |
Medium |
8.0 |
mongodb8legacy |
✅ Compatible |
High |
Test Scenarios
Basic Operations:
- Create/Read/Update/Delete operations
- Collection queries and filters
- Index operations
Advanced Operations:
- Aggregation pipelines
- Complex queries with null/undefined
- Direct operations
- Raw collection operations
Migration Operations:
- Database migrations
- Data import/export
- Schema changes
Performance Testing:
- Large dataset operations
- Concurrent operations
- Memory usage
Monitoring and Debugging
MongoDB Driver System
The MongoDB driver system provides:
- Automatic version detection
- Driver selection based on MongoDB version
- Connection monitoring
- Error tracking
Debug Methods
// Get connection statistics
Meteor.call('mongodb-driver-stats', (error, result) => {
console.log('Connection Stats:', result);
});
// Test connection
Meteor.call('mongodb-driver-test-connection', (error, result) => {
console.log('Connection Test:', result);
});
// Get supported versions
Meteor.call('mongodb-driver-supported-versions', (error, result) => {
console.log('Supported Versions:', result);
});
Real-time Monitoring
// Subscribe to monitoring
Meteor.subscribe('mongodb-driver-monitor');
// Access data in template
Template.yourTemplate.helpers({
driverStats() {
return MongoDBDriverMonitor.findOne('stats');
}
});
Best Practices
Query Optimization
- Use Indexes: Ensure proper indexes for frequently queried fields
- Limit Results: Use
.limit()
and .skip()
for pagination
- Project Fields: Use projection to limit returned fields
- Aggregation: Use aggregation pipelines for complex operations
Security
- Validate Input: Always validate user input
- Use Regular Methods: Prefer regular methods over direct operations
- Server-side Only: Keep sensitive operations server-side
- Audit Logging: Log important operations
Performance
- Connection Pooling: Use connection pooling for better performance
- Batch Operations: Use batch operations for bulk data
- Caching: Implement caching for frequently accessed data
- Monitoring: Monitor query performance and optimize as needed
Troubleshooting
Common Issues
Connection Failures:
- Check MONGO_URL configuration
- Verify MongoDB server is running
- Check network connectivity
Query Errors:
- Verify query syntax
- Check field names and types
- Validate MongoDB version compatibility
Performance Issues:
- Check indexes
- Optimize queries
- Monitor connection pool usage
Debug Commands
# Check MongoDB version
mongo --eval "db.version()"
# Check connection status
mongo --eval "db.runCommand({connectionStatus: 1})"
# Check indexes
mongo --eval "db.collection.getIndexes()"
# Check query performance
mongo --eval "db.collection.find().explain('executionStats')"
Migration Guide
From Older MongoDB Versions
- Backup Data: Always backup before migration
- Test Compatibility: Test with target MongoDB version
- Update Drivers: Use appropriate driver for MongoDB version
- Run Migrations: Execute any necessary data migrations
- Validate: Verify all functionality works correctly
To Newer MongoDB Versions
- Check Compatibility: Verify all queries are compatible
- Update Queries: Fix any deprecated method usage
- Test Thoroughly: Test all functionality
- Monitor Performance: Watch for performance changes
- Update Documentation: Update any version-specific documentation
Support
For MongoDB compatibility issues:
- Check this guide for known issues and solutions
- Review MongoDB release notes for version-specific changes
- Test with the MongoDB driver system
- Use the monitoring tools to diagnose issues
- Consult the Wekan community for additional help
License
This MongoDB Compatibility Guide is part of Wekan and is licensed under the MIT License.