Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mongoose query using if else possible?

I have this Schema:

const guestSchema = new Schema({
  id: String,
  cart: [
    {
      product: {
        type: mongoose.Schema.ObjectId,
        ref: "products"
      },
      quantity: Number
    }
  ]
});

I have this query:

Guest.findOneAndUpdate(
        { id: req.sessionID },
        {
          $cond: [
            { "cart.product": { $ne: req.body.itemID } },
            { $push: { "cart": { product: req.body.itemID, quantity: 1 } } },
            { $inc: { "cart.quantity": 1 } }
          ]
        },
        { upsert: true, new: true }
      ).exec(function(err, docs) {
        err ? console.log(err) : res.send(docs);
});

Basically, what I'm trying to do is update based on a condition. I tried using $cond, but found out that operator isn't used for querys like I'm doing.

Based on this:

{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] }

I want something similar to the functionality of this operator for my query.

Let's break down my condition:

For my boolean expression: I want to check if req.body.itemID is $ne to any of the values in my cart

If true then: $push the itemID and quantity into the cart

Else (then item already exists): $inc the quantity by 1

Question: How would achieve this result? Do I need to make two seperate querys? I'm trying to avoid doing that if possible

like image 778
Phillip Avatar asked Nov 07 '22 09:11

Phillip


1 Answers

I went through all their Update Field Operators, and there's probably no way to do this in the way I want.

I wonder why there is no $cond for update operators. Nonetheless, I have the solution to what I wanted the functionality accomplish. Just not in the elegant fashion that I would like it.

Guest.findOneAndUpdate(
        { id: req.sessionID },
        { id: req.sessionID }, //This is here in case need to upsert new guest
        { upsert: true, new: true }
      ).exec(function(err, docs) {
        if (err) {
          console.log(err);
        } else {

          //Find the index of the item in my cart
          //Returns (-1) if not found
          const item = doc.cart.findIndex(
            item => item.product == req.body.itemID
          );

          if (item !== -1) {
            //Item found, so increment quantity by 1
            doc.cart[item].quantity += 1;
          } else {
            //Item not found, so push into cart array
            doc.cart.push({ product: req.body.itemID, quantity: 1 });
          }

          doc.save();
        }
});
like image 157
Phillip Avatar answered Nov 27 '22 16:11

Phillip