如何在MongoDB中存储Azure Service Bus内部Long类型消息ID?
解决Azure Service Bus调度消息ID存储与复用问题
针对你遇到的Azure Service Bus调度消息ID(内部Long类型)无法存入MongoDB后复用的问题,以下是几个可行的方案:
方案1:序列化为字符串存储(推荐)
Azure Service Bus返回的Long类型支持直接转为字符串(无精度损失),存入MongoDB的字符串字段即可。取出时再用对应Long库解析字符串重建对象:
- 存储时:将调度ID转为字符串存入
import { ServiceBusClient } from "@azure/service-bus"; const sbClient = new ServiceBusClient(connectionString); const sender = sbClient.createSender(queueName); // 调度消息并获取ID const scheduledIds = await sender.scheduleMessages(messages, scheduledTime); // 转字符串存入MongoDB const scheduledIdStr = scheduledIds[0].toString(); await yourMongoModel.create({ scheduledMessageId: scheduledIdStr });
- 取消时:从MongoDB取出字符串,用Long库重建对象
因为@azure/service-bus内部依赖的是longnpm包,你可以直接安装该包:
npm install long
然后重建Long对象并调用取消方法:
import { Long } from "long"; import { ServiceBusClient } from "@azure/service-bus"; const savedDoc = await yourMongoModel.findById(docId); const scheduledId = Long.fromString(savedDoc.scheduledMessageId); const sbClient = new ServiceBusClient(connectionString); const sender = sbClient.createSender(queueName); await sender.cancelScheduledMessages(scheduledId);
方案2:拆分Long的高低位存储
Long类型本质由高32位和低32位数值组成,你可以将这两个值存入MongoDB的数值字段,取出时再拼接:
- 存储时:拆分高低位
const scheduledId = scheduledIds[0]; await yourMongoModel.create({ scheduledIdHigh: scheduledId.high, scheduledIdLow: scheduledId.low });
- 取消时:用高低位重建Long
import { Long } from "long"; const savedDoc = await yourMongoModel.findById(docId); const scheduledId = Long.fromBits(savedDoc.scheduledIdLow, savedDoc.scheduledIdHigh); // 调用取消逻辑 await sender.cancelScheduledMessages(scheduledId);
方案3:使用Mongoose的BSON Long类型(适用于Mongoose用户)
如果你的项目用Mongoose操作MongoDB,可以直接将字段定义为mongoose.Schema.Types.Long,Mongoose会自动处理BSON Long与Azure内部Long的兼容:
- 定义Schema
import mongoose from "mongoose"; const yourSchema = new mongoose.Schema({ scheduledMessageId: { type: mongoose.Schema.Types.Long, required: true } }); const YourModel = mongoose.model("YourModel", yourSchema);
- 存储与取消
存储时直接赋值Azure返回的Long对象,取出后可直接传入cancelScheduledMessages(若存在兼容问题,可再用Long.fromValue()转换):
// 存储 await YourModel.create({ scheduledMessageId: scheduledIds[0] }); // 取消 const savedDoc = await YourModel.findById(docId); await sender.cancelScheduledMessages(savedDoc.scheduledMessageId);
内容的提问来源于stack exchange,提问作者Evan Childs
相关产品推荐
相关产品推荐

