Home > database >  MongoDB: how can I pull an entire object from an object array that matches the Objectid?
MongoDB: how can I pull an entire object from an object array that matches the Objectid?

Time:01-04

My question is, how I can pull a team object in teams that matches the unique _id of a team(in teams array). Here is what I have tried, however, the problem is that all entries in teams get deleted, instead of only the object that matches the team _id.

router.put("/delete/team/:id/:org", (req, res) => {
  const orgid = req.params.org;
  const _id = req.params.id;

  Organization.findOneAndUpdate(
    {
      _id: orgid,
    },
    {
      $pull: {
        teams: { _id: _id },
      },
    },
    { multi: true }
  )
    .then((organization) => {
      res.status(200).json(organization);
    })
    .catch((err) => {
      res.status(400).json(err);
    });
});

Each Organization in OrganizationSchema has a unique _id. Also, each team(object) in teams array has a unique _id.

const OrganizationSchema = new Schema({
  owner: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
  },
  register_date: {
    type: Date,
    default: Date.now,
  },
  teams: [
    {
      sport: {
        type: String,
        required: false,
      },
      access_code: {
        type: Number,
        required: false,
      },
      admin: [{ type: mongoose.Schema.Types.ObjectId, ref: "User" }],
      events: [
        {
          date_time: {
            type: Date,
            offset: true,
          },
          opponent: {
            type: String,
            required: true,
          },
          home_away: {
            type: String,
            required: true,
          },
          expected_attendance: {
            type: Number,
          },
          people_attending: [
            { type: mongoose.Schema.Types.ObjectId, ref: "User" },
          ],
          amenities: [String],
        },
      ],
    },
  ],
});

CodePudding user response:

The probable reason for the output you are getting is, because you are matching an ObjectId with a string.

You need to convert your string to an object.

You can do this by adding,

const ObjectID = require('mongodb').ObjectID

And then,

 $pull: {
        teams: { _id: new ObjectID(_id) },
      },
  • Related