NodeJS 我在mongo数据库的数组中有对象我想删除所有对象,但总是留下一个对象{ id:_oldxxxxxxxx}

1cklez4t  于 2022-12-03  发布在  Node.js
关注(0)|答案(1)|浏览(84)

我在mongo DB中使用了一些带有moongooes的javascript代码来存储数据。有时我需要删除数组中的所有对象并获得一个干净的数组。
这是我架构

const orderSchema =new Schema({
    
     date: {
      type: Date, 
    },
    OrderNumber: {
      type: String,
      required: true
    },
    City: {
      type: String,
      required: true
    },
    Address: {
      type: String,
      required: true
    },
    Phone: {
      type: String
    },
    Country: {
      type: String
    },
    Name: {
      type: String,
      required: true
    },
    Trackingnumber: {
      type: String
    },
    ZipCode: {
      type: Number
    },
    Province: {
      type: String,
      
    },
    fulfillmentOrders:{
      type: String,
    },
    Quantity: {    
    },
     
  });

 Holde:[
      orderSchema
  ],

module.exports = mongoose.model('User', userSchema);

我在蒙戈的数据看起来像这样

"Holde": [
    {
      "OrderNumber": "gid://shopify/Order/4958122475753",
      "City": "xxxx",
      "Address": "xxxx",
      "Phone": "",
      "Country": "xxx",
      "Name": "xxx",
      "Trackingnumber": "0",
      "ZipCode": xxxx,
      "fulfillmentOrders": "gid://shopify/FulfillmentOrder/6034089509097",
      "Quantity": [
        {
          "quantity": 1,
          "product": {
            "id": "gid://shopify/Product/7909915590889"
          },
          "variant": {
            "sku": "11111"
          }
        }
      ],
      "_id": {
        "$oid": "6389b12faaade0788141bf4f"
      }

我尝试用这段代码删除数组中的所有对象

const User = require('../model/User'); 
const foundUse=  await User.findOne({ "user":req.body.user}).exec();


 await foundUse.updateOne({
        Holde :{  
          $pull:  {'_id':6389b12faaade0788141bf4f}, 
        }
            },
           )

并期望得到“保持”:[]但实际上我得到

"Holde": [
    {
      "_id": {
        "$oid": "6389d882afbc458cc1c1af23"
      }
    }
  ],
ddrv8njm

ddrv8njm1#

这是很正常的,因为你正在更新您的用户与这些数据.
对于mongoose,正确删除项的方法是.deleteMany(),但在您的情况下,它只删除用户(您似乎只想删除订单)。然后,您可以过滤用户的订单,并使用FindOneAndUpdate重新分配它,而不删除找到的订单,如下所示:

const User = require('../model/User'); 
const foundUser = await User.findOne({ "user": req.body.user });
const result = await User.updateOne({
  Holde: foundUser?.Holde.filter(holde => holde._id !== HOLD_ID_TO_DELETE)
});

其中HOLD_ID_TO_DELETE是要删除的id(此时您似乎传递了带有所有订单的整个用户对象)
但是,创建一个Order系列,使用ref链接到您的User系列,会更漂亮,更容易维护。

相关问题