@agendajs/mongo-backend

中文文档
4.0.4发布于 2026/10/31MITTypeScriptES Module构建来源已验证近 30 天下载 10万

议程任务调度器 MongoDB 后端

中文使用文档
文档目录16 节
  1. 安装
  2. 使用量
  3. 配置选项
  4. 带选项的完整示例
  5. 实时通知
  6. 备选案文1:MongoDB变化流(国内)
  7. 备选案文2:记忆(单一进程)
  8. 备选案文3:Redis Pub/Sub(多程序)
  9. 数据库索引
  10. 附加索引
  11. 任务日志
  12. 自动使用
  13. 独立使用
  14. 查询日志
  15. 相关软件包
  16. 许可证

@ agendajs/mongo-后端

MongoDB 的后端 议程项目 工作调度员.

安装

npm install agenda @agendajs/mongo-backend
# or
pnpm add agenda @agendajs/mongo-backend
# or
yarn add agenda @agendajs/mongo-backend

所需经费:

  • 节点.js 18+
  • 蒙戈DB 4+ 导弹

使用量

import { Agenda } from 'agenda';
import { MongoBackend } from '@agendajs/mongo-backend';

// Via connection string
const agenda = new Agenda({
  backend: new MongoBackend({
    address: 'mongodb://localhost/agenda'
  })
});

// Or via existing MongoDB connection
import { MongoClient } from 'mongodb';

const client = await MongoClient.connect('mongodb://localhost');
const db = client.db('agenda');

const agenda = new Agenda({
  backend: new MongoBackend({ mongo: db })
});

// Define jobs
agenda.define('send-email', async (job) => {
  const { to, subject } = job.attrs.data;
  await sendEmail(to, subject);
});

// Start processing
await agenda.start();

// Schedule jobs
await agenda.every('1 hour', 'send-email', { to: '[email protected]', subject: 'Hello' });

配置选项

interface IMongoBackendConfig {
  /** MongoDB connection string */
  address?: string;

  /** Existing MongoDB database instance */
  mongo?: Db;

  /** Collection name for jobs (default: 'agendaJobs') */
  collection?: string;

  /** MongoDB client options */
  options?: MongoClientOptions;

  /** Name to identify this Agenda instance (stored as lastModifiedBy) */
  name?: string;

  /** Whether to create indexes on connect (default: true) */
  ensureIndex?: boolean;

  /** Sort order for job queries */
  sort?: { [key: string]: SortDirection };
}

带选项的完整示例

const agenda = new Agenda({
  backend: new MongoBackend({
    address: 'mongodb://localhost/agenda',
    collection: 'jobs',           // Custom collection name
    sort: { nextRunAt: 'asc', priority: 'desc' }
  }),
  processEvery: '30 seconds',     // Job polling interval
  maxConcurrency: 20,             // Max concurrent jobs
  defaultConcurrency: 5           // Default per job type
});

实时通知

MongoBackend只提供存储,并使用投票来检查新的工作. 对于跨分布式系统的实时工作处理,您有几种选择:

备选案文1:MongoDB变化流(国内)

如果您的 MongoDB 部署是复制件集( 甚至单节点复制件集) , 您可以使用 MongoChangeStreamNotificationChannel 本地实时通知中没有任何外部依赖性:

import { Agenda } from 'agenda';
import { MongoBackend, MongoChangeStreamNotificationChannel } from '@agendajs/mongo-backend';

const agenda = new Agenda({
  backend: new MongoBackend({ mongo: db }),
  notificationChannel: new MongoChangeStreamNotificationChannel({ db })
});

// Jobs are processed immediately when created (no polling delay)
await agenda.start();
await agenda.now('myJob'); // Triggers instant processing

所需经费:

  • MongoDB 复制套件(单节点复制套件工作精细)
  • 有线老虎存储引擎(自MongoDB 3.2起默认)

配置选项 :

const channel = new MongoChangeStreamNotificationChannel({
  db: mongoDb,                    // Required: MongoDB database instance
  collection: 'agendaJobs',       // Optional: collection name (default: 'agendaJobs')
  resumeToken: savedToken,        // Optional: resume from specific point
  fullDocument: true              // Optional: include full document on updates (default: true)
});

备选案文2:记忆(单一进程)

import { Agenda, InMemoryNotificationChannel } from 'agenda';
import { MongoBackend } from '@agendajs/mongo-backend';

// For single-process apps (testing/development)
const agenda = new Agenda({
  backend: new MongoBackend({ mongo: db }),
  notificationChannel: new InMemoryNotificationChannel()
});

备选案文3:Redis Pub/Sub(多程序)

import { Agenda } from 'agenda';
import { MongoBackend } from '@agendajs/mongo-backend';
import { RedisBackend } from '@agendajs/redis-backend';

// For production: use Redis for notifications
const redisBackend = new RedisBackend({ connectionString: 'redis://localhost:6379' });
const agenda = new Agenda({
  backend: new MongoBackend({ mongo: db }),
  notificationChannel: redisBackend.notificationChannel
});

数据库索引

默认情况下, MongoBackend 自动创建 findAndLockNextJobIndex 用于优化任务查询性能的连接索引。 该指数包括:

{
  "name": 1,
  "nextRunAt": 1,
  "priority": -1,
  "lockedAt": 1,
  "disabled": 1
}

要禁用自动索引创建( 例如, 如果您单独管理索引 ) :

const backend = new MongoBackend({
  mongo: db,
  ensureIndex: false  // Skip automatic index creation
});

附加索引

如果您使用 议程项目sh中,添加此索引,用于更好的仪表板性能:

db.agendaJobs.createIndex({
  "nextRunAt": -1,
  "lastRunAt": -1,
  "lastFinishedAt": -1
}, { name: "agendash" })

如果您有上千个实例的工作定义, 此索引可以改进锁定查询 :

db.agendaJobs.createIndex({
  "name": 1,
  "disabled": 1,
  "lockedAt": 1
}, { name: "findAndLockDeadJobs" })

任务日志

MongoBackend 包含内置 MongoJobLogger 将结构化的工作生命周期活动储存在专门的MongoDB收藏中(agenda_logs (默认情况下). 伐木机是轻量级的,并且只在第一次使用时创建它的收藏.

自动使用

当您在议事日程中启用日志时, 后端的内置登录器会被自动使用 :

const agenda = new Agenda({
  backend: new MongoBackend({ mongo: db }),
  logging: true  // Uses MongoJobLogger automatically
});

独立使用

您还可以使用 MongoJobLogger 独立 – 例如, 在使用不同的后端存储时登录到 MongoDB :

import { MongoJobLogger } from '@agendajs/mongo-backend';

const logger = new MongoJobLogger({
  mongo: db,                        // Required: MongoDB database instance
  logCollection: 'agenda_logs'      // Optional: collection name (default: 'agenda_logs')
});

// Use with any backend
import { RedisBackend } from '@agendajs/redis-backend';
const agenda = new Agenda({
  backend: new RedisBackend({ connectionString: 'redis://...' }),
  logging: logger
});

查询日志

const { entries, total } = await agenda.getLogs({
  jobName: 'send-email',
  level: 'error',
  limit: 50,
  sort: 'desc'
});

// Clear old logs
await agenda.clearLogs({ to: new Date(Date.now() - 30 * 86400000) });

见 议程项目研究 用于完整记录文件.

许可证

麻省理工学院

版本与发布记录

@agendajs/mongo-backend 共发布 12 个版本,首次发布于 2026/01/26;过去 12 个月发布了 12 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
4.0.4latest2026/10/317 天前
4.0.32026/07/213 个月前
4.0.22026/05/095 个月前
4.0.12026/04/027 个月前
4.0.02026/02/268 个月前
3.2.02026/02/168 个月前

其他发布通道:alpha → 1.0.0-alpha.0。

关于 @agendajs/mongo-backend 的常见问题

@agendajs/mongo-backend 是什么?

议程任务调度器 MongoDB 后端

如何安装 @agendajs/mongo-backend?

在项目目录运行 npm install @agendajs/mongo-backend,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:agenda(6.2.7)、mongodb(^6.0.0 || ^7.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@agendajs/mongo-backend 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@agendajs/mongo-backend 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@agendajs/mongo-backend 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18.0.0。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@agendajs/mongo-backend 可以商用吗?

@agendajs/mongo-backend 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@agendajs/mongo-backend 的下载量有多少?

根据 npm 官方下载统计,@agendajs/mongo-backend 在 2026/10/05 – 2026/11/03 这 30 天内被下载 99,535 次,日均约 3,318 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@agendajs/mongo-backend 还在维护吗?

最新版本 4.0.4 发布于 2026/10/31(7 天前);至今共发布 12 个版本,其中过去 12 个月发布了 12 个;首次发布于 2026/01/26。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。