Mongodb Nestjs Mongoose,如何通过其_id删除数组成员?
模式是这样的。这是一个购物车,里面有:Mongodb Nestjs Mongoose,如何通过其_id删除数组成员?,mongodb,typescript,mongoose,nestjs,Mongodb,Typescript,Mongoose,Nestjs,模式是这样的。这是一个购物车,里面有: export interface Cart extends mongoose.Document { userId: string; total: number; count: number; status: string; items: [ { itemId: string; itemName: string; count: number; price: number;
export interface Cart extends mongoose.Document {
userId: string;
total: number;
count: number;
status: string;
items: [
{
itemId: string;
itemName: string;
count: number;
price: number;
itemTotal: number;
},
];
}
如果查看mondodb数据,items数组中的每个成员都有一个_id。
我有这个_id,我想用这个_id删除一个项目。
问题是,它是typescript,并且_id不是模式的一部分。
以下是我用来删除项目的代码:
const cart = await this.cartModel.findOneAndUpdate(
{ _id: dto.cartId },
{ $pull: { items: { _id: '1234567890' } } },
{ new: true },
);
这意味着,在该特定购物车中,找到id等于1234567890的商品,并将其删除。
但是_id是红色的,因为它不是我的模式的一部分。
如何解决这个问题?它应该是id而不是id。因为id是一个对象。但我们的查询无法将对象发送到参数。所以,它应该是一个十六进制字符串
您可以通过以下方式将实体id更改为id:
@ObjectIdColumn()
@Transform(id => id.toString())
id: string;
所以,您可以在任何地方使用id作为十六进制字符串。希望它有帮助由于缺乏更好的解决方案,我通过添加一个名为timeStamp的文本字段绕过了这个问题。当一个项目被添加到购物车中时,我将当前时间(以毫秒为单位)推送到该字段,该字段是唯一的,足以区分购物车中的条目。如果您想知道,itemId还不够好,因为人们可以在两行或更多行中使用不同的细节来显示相同的项目。当然,我已经在我的模式中添加了新字段,所以typescript并没有抱怨 您的模式是什么样子的?和界面一样吗?或者您正在使用子文档架构?如果架构中未定义_id,则默认情况下它是一个ObjectId。请使用Types.ObjectId将id转换为ObjectId。您可以始终使用Types.ObjectDobjectString将其转换为mongoose的ObjectId。queryid也无效,因为它不是我的类的一部分。我想这不是猫鼬的错,在纯javascript中它会工作得很好。但是按照Nest.js的工作方式,我无法访问该字段。