1

我正在使用分子操作将数据输入到我的数据库中。我主要使用带有猫鼬的 NodeJS 来定义模型。到目前为止,我能够创建一个模型,但是当我尝试创建一个一对多的关系时,它给了我这个错误

错误:{ 'deliveryParcels.0': CastError: Cast to [ObjectId] failed for value "[{"parcelId":"LHE660851871415","address":"24 E muhafiz town lahore","type":"COD", "addressLocation":{"lat":31.4532941,"lng":74.2166403},"customerName":"ALI MALHI","customerPhone":"3314488396","processingStatus":"pending","amount":2500," vendorOrderId":"other"}]" 在路径 "deliveryParcels.0"

我希望同时创建两个集合rider-tasksdelivery-parcels但只rider-tasks创建集合而不创建delivery-parcels. 我在架构中做错了什么?

这是我的模型

骑手任务模型

import mongoose, { Schema } from "mongoose";
import { getDbConnection } from "../../../utils/db/db-connect";

/* eslint-disable id-blacklist */
import { IRiderTaskModel } from "../interfaces/rider-task.interface";
const RiderTaskSchema: Schema<IRiderTaskModel> = new Schema<IRiderTaskModel>(
    {
        _id: { type: String, required: true, unique: true },
        riderId: { type: String, required: true },
        totalAmount: { type: Number, required: true },
        riderName: { type: String, required: true },
        cityId: { type: String, required: true },
        cityName: { type: String, required: true },
        status: { type: String, required: true },
        adminName: { type: String, required: true },
        adminId: { type: String, required: true },
        createdAt: { type: Date, required: true },
        deliveryParcels: [
            {
                type: Schema.Types.ObjectId,
                ref: "delivery-parcels",
            },
        ],
    },
    { _id: true }
);

const RiderTask = getDbConnection("deliveryManagement").model<IRiderTaskModel>(
    "rider-tasks",
    RiderTaskSchema
);
export { RiderTask };

快递包裹

import mongoose, { Schema } from "mongoose";
import { getDbConnection } from "../../../utils/db/db-connect";
import { IDeliveryParcelModel } from "../interfaces/delivery-parcels.interface";
const DeliveryParcelsSchema: Schema<IDeliveryParcelModel> = new Schema<IDeliveryParcelModel>(
    {
        parcelId: { type: String, required: true },
        address: { type: String, required: true },
        addressLocation: {
            lat: { type: Number, required: true },
            lng: { type: Number, required: true },
        },
        customerName: { type: String, required: true },
        customerPhone: { type: String, required: true },
        processingStatus: { type: String, required: true },
        amount: { type: Number, required: true },
        riderTaskId: { type: Schema.Types.String, ref: "rider-tasks" },
        type: { type: String, required: true, enum: ["COD", "NONCOD"] },
        postedStatus: {
            status: { type: String },
            statusKey: { type: String },
            signature: { type: String },
            reason: { type: String },
            checkBoxData: [{ type: String }],
            adminId: { type: String },
            adminName: { type: String },
        },
    }
);

const DeliveryParcels = getDbConnection(
    "deliveryManagement"
).model<IDeliveryParcelModel>("delivery-parcels", DeliveryParcelsSchema);
export { DeliveryParcels };

我的服务

private async createdRiderTaskHandler(ctx: Context<IRiderTaskModel>) {
    const { params } = ctx;
    const finalData: IParcelData[][] = await Promise.all(
        params.deliveryParcels.map((parcel) =>
            this.broker.call("parcel-data.getParcels", {
                id: parcel.parcelId,
            })
        )
    );
    const wrongParcels: string | any[] = [];
    const check = finalData[0].filter(
        (data) => data.currentStatus.status === "Dispatched"
    )[0];
    if (check) {
        wrongParcels.push(check.parcelId);
        const parcel = wrongParcels.join("\r\n");
        throw new Error(
            'These parcels "' + parcel + '" have already been dispatched'
        );
    }
    const codAmount = params.deliveryParcels
        .filter((data, i) => data.type === "COD")
        .reduce((total, b) => total + b.amount, 0);

    const customId = "RTD-" + Math.floor(100000 + Math.random() * 900000);
    try {
        const taskData = omit({
            ...params,
            _id: customId,
            totalAmount: codAmount,
            forceAssignment: false,
            createdAt: new Date(),
        });

        const data = await RiderTask.create(taskData);
        return { message: data };
    } catch (error) {
        this.logger.error(error);
        return error;
    

   }
}
4

0 回答 0