Home > Net >  i have objects in array in mongo db i want to delete all the objects but always left one object with
i have objects in array in mongo db i want to delete all the objects but always left one object with

Time:12-03

I have some code in javascript with moongooes that I used in mongo DB to store a data Sometimes I need to delete all the objects in array and get a clean array

this is my schema

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);

and my data on mongo looks like this

 "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"
      }
   

I try to delete all the objects in my array whit this code



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



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

and expect to get "hold":[] but actually I get

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

CodePudding user response:

It's pretty normal because you are updating your User with theses data.

With mongoose, the way to propperly delete item is .deleteMany(), but in your case it will only delete the User (and you seems to want to delete only the order). You can then filter user's orders and re-assign it without the found order, using FindOneAndUpdate, like:

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)
});

Where HOLD_ID_TO_DELETE is the id to delete (you seems to pass the whole user object with all orders at the moment)

But not it would be prettier and more maintenable to create an Order collection, linked to your User one using ref.

  • Related