Mongoose 用 _id 创建一个对象

问题描述 投票:0回答:1

我正在使用node js和express,我使用mongoose从后端管理数据库,我有orden的nect模型

const { Schema, model } = require('mongoose');

const orderSchema = Schema({
    orden_number: {
        type: String,
        required: true,
    },
    create_at: {
        type: Date,
        default: Date.now
    },
    update_at: {
        type: Date,
        default: Date.now
    },
    customer: {
        type: Schema.Types.ObjectId,
        ref: 'User',
        require: true
    },
    history: [{
        status: {
            type: Schema.Types.ObjectId,
            ref: 'OrderStatus',
            required: true
        },
        name_status: { 
            type: String, 
            required: true
        },
        update_at: { 
            type: Date,
            required: true,
            default: Date.now
        },
        updater: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        }
    }],
    status: {
        type: Schema.Types.ObjectId,
        ref: 'OrderStatus',
        require: true
    },
    account: {
        type: Schema.Types.ObjectId,
        ref: 'Accounts',
        require: true
    },
    secure_codes: {
        type: String
    },  
    package: {
        type: Schema.Types.ObjectId,
        ref: 'Packages',
        require: true
    },
    comments: [ {comment: { type: String, required: true}}]

});

module.exports = model( 'Orders', orderSchema )

当我插入寄存器时,数组历史记录会自动为每个对象创建一个 _id,如果我编辑一个寄存器并且我想在“历史记录”列表中插入一个新对象,这个新寄存器有一个新的 _id,如下图所示.

这是我的后置控制器

const postOrder = async ( req = request, res = response ) => {
    try {
        const { accountId, codes, packageId } = req.body
        const customer = req.user.id;
        
        const infoAccount = await Accounts.findById( accountId );
        if ( !infoAccount ) throw new Error ('No existe esta cuenta en la base de datos.');
        if ( !infoAccount.user.equals(customer)) throw new Error('La cuenta a recargar no pertenece al usuario.');

        const defaultStatus = await OrderStatus.findOne({ name: 'Pago en Verificación'})
        if ( !defaultStatus ) throw new Error('No se pudo encontrar el estado para esta orden, valide con administrador!')

        const history = {
            status: defaultStatus._id,
            name_status: defaultStatus.name,
            update_at: Date.now(),
            updater: customer,
        }
        
        let secure_codes = null;
        if ( infoAccount.access === "Facebook") {
            if ( !codes ) throw new Error('Se requieren que envies los codigos ya que tu acceso es con facebook')
            secure_codes = codes;
        }
        
        const infoPackage = await Packages.findById( packageId );
        if ( !infoPackage ) throw new Error('Este paquete no existe en la base de datos')
        
        const orderData = {
            account         : infoAccount._id,
            comments        : 'Se validara si el pago se realizo correctamente',
            customer,
            history,
            orden_number    : 'Play',
            package         : infoPackage._id,
            secure_codes,
            status          : defaultStatus._id,
        }

        const order = await new Orders( orderData )
        order.save();

        return res.status(201).json({
            ok: true,
            data: ['Orden creada con exito.']
        })

    } catch (error) {
        console.log(error);
        return res.status(400).json({
            ok: false,
            data: [error.message]
        })
    }
}

这是我的放置控制器

const putStatusOrder = async ( req = request, res = response) => {
    try {
        const { id: orderId } = req.params;
        
        const order = await Orders.findById( orderId ).populate('status', 'name');
        if ( !order ) throw new Error('No existe la orden que se desea actualizar');

        const { status } = req.body

        const infoStatus = await OrderStatus.findById(status);
        if ( !infoStatus ) throw new Error('El estado que se quiere asignar no existe')

        const history = order.history;
        history.push({
            status,
            name_status: infoStatus.name,
            update_at: Date.now(),
            updater: req.user.id
        })
        order.history = history;
        order.save();
        
        return res.status(200).json({
            ok: true,
            data: order
        })
    } catch (error) {
        console.log(error);
        return res.status(400).json({
            ok: false,
            data: [error.message]
        })
    }

}

当我创建或更新寄存器时,我不希望在“历史记录”的每个对象中都有一个新的 id,我该怎么做?我不需要子文档,我只想要一个历史记录来保存订单的可追溯性。

javascript node.js mongodb express mongoose
1个回答
0
投票

在 mongoose 中,所有顶级文档和子文档都会自动分配一个

_id
,其值类型为
ObjectId

为了停止此功能,您需要在架构中显式声明

_id: false
选项。

对你来说就是:

const orderSchema = Schema({

    //..
    //...
    history: [{
        status: {
            type: Schema.Types.ObjectId,
            ref: 'OrderStatus',
            required: true
        },
        name_status: { 
            type: String, 
            required: true
        },
        update_at: { 
            type: Date,
            required: true,
            default: Date.now
        },
        updater: {
            type: Schema.Types.ObjectId,
            ref: 'User',
            required: true
        },
        _id: false //< declare this in the schema for history
    }],
    //...
    //...

});
© www.soinside.com 2019 - 2024. All rights reserved.