Проверка существующего значения в массиве вложенного объекта перед обновлением в Мангусте

#mongodb #express #mongoose #mongodb-query #mongoose-schema

Вопрос:

Это моя модель тележки:

 const cartSchema = new mongoose.Schema({
    user: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "userSchema",
    },
    cart: [
        {
            product: { type: mongoose.Schema.Types.ObjectId, ref: "productSchema" },
            amount: { type: Number, require: true, min: 0 },
            price: { type: Number, min: 0 },
        },
    ],
    totalPrice: {
        type: Number,
        min: 0,
        default: 0,
    },
});
 

Я хотел бы проверить корзину.товар, прежде чем обновлять его, добавляет новый товар, если его еще нет, увеличьте сумму с помощью товара
Я пытаюсь таким образом сначала протестировать, но это не работает должным образом

 router.put("/add-to-cart", authenticateToken, async (req, res) => {
    try {
        const productInfo = await productSchema.findById(req.body.id);
        const filter = {
            $and: [{ user: req.user }, { "cart.product": { $nin: [req.body.id] } }],
        };
        const options = { upsert: true, new: true, setDefaultsOnInsert: true };
        const update = {
            $push: {
                cart: {
                    product: req.body.id,
                    amount: req.body.amount,
                    price: req.body.amount * productInfo.productPrice,
                },
            },
        };
        await cartSchema.findOneAndUpdate(filter, update, options);
        return res.status(201).send({ status: true });
    } catch (err) {
        res.status(500).send({ message: err });
    }
});
 

Ответ №1:

Я думаю, что ваш код работает нормально, возможно, это из-за вашего перехода идентификатора и объекта

 db.collection.update({
  $and: [
    {
      user: "1"
    },
    {
      "cart.product": {
        $nin: [
          "1"
        ]
      }
    }
  ],
  
},
{
  $push: {
    cart: {
      product: "1",
      amount: 1,
      price: 10
    }
  }
})
 

mongoplayground