【问题标题】:Nestjs Mongoose, How to delete array member by its _id?Nestjs Mongoose,如何通过 _id 删除数组成员?
【发布时间】:2020-09-24 01:29:54
【问题描述】:

架构是这样的。这是一个装有物品的购物车:

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 删除一个项目。 问题是,它是打字稿,而 _id 不是模式的一部分。 这是我用来删除项目的代码:

const cart = await this.cartModel.findOneAndUpdate(
   { _id: dto.cartId },
   { $pull: { items: { _id: '1234567890' } } },
   { new: true },
);

这意味着,在该特定购物车中,找到 _id 等于 1234567890 的商品,然后将其删除。 但是 _id 有红色波浪,因为它不是我的架构的一部分。 我该如何解决这个问题?

【问题讨论】:

  • 您的架构是什么样的?和界面一样吗?或者您正在使用子文档模式?如果_id 未在架构中定义,则默认为ObjectId
  • 使用Types.ObjectId(id)将id转换为ObjectId

标签: mongodb typescript mongoose nestjs


【解决方案1】:

应该是 id 而不是 _id。因为 _id 是一个对象。但是我们的查询不能将对象发送到参数。所以,它应该是一个 hexString。

您可以通过以下方式将您的实体 _id 更改为 id:

 @ObjectIdColumn()
 @Transform(id => id.toString())
 id: string;

因此,您可以在任何地方使用 id 作为 hexString。希望对你有帮助

【讨论】:

  • 您可以随时使用Types.ObjectId(objectIdString) 将其转换为ObjectId 以进行mongoose 查询
  • id 也是无效的,因为它不属于我的课程。我想这不是猫鼬的错,在普通的 javascript 中它会很好用。但是 Nest.js 的工作方式,我无权访问该字段。
【解决方案2】:

由于缺乏更好的解决方案,我通过添加一个名为 timeStamp 的文本字段绕过了这个问题。当一个项目被添加到购物车时,我将当前时间(以毫秒为单位)推送到该字段,这足以区分购物车中的条目。如果您想知道, itemId 还不够好,因为人们可以在 2 行或更多行中拥有相同的项目,但细节不同。我当然已经将新字段添加到我的架构中,所以打字稿没有抱怨;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2014-07-18
    • 2016-09-17
    • 2014-10-31
    • 1970-01-01
    • 2015-02-27
    相关资源
    最近更新 更多