I want to push only unique objects into an array with $addToSet
.
My userSchema
has a field bankDetails
which should take an array of objects:
const userSchema = new mongoose.Schema(
{
bankDetails: [
{
cardHolder: String,
cardNumber: String,
expiry: String,
cvc: String,
cardBrand: String,
},
]
}
)
I am updating the schema using the following controller function:
exports.createPayment = async (req, res) => {
const { user, cardHolder, cardNumber, expiry, cvc, cardBrand } = req.body
const saveDetails = await User.findByIdAndUpdate(
{ _id: user._id },
$addToSet: {
bankDetails: {
cardHolder,
cardNumber,
expiry,
cvc,
cardBrand,
},
},
{ new: true }
).exec();
res.json(saveDetails);
}
The data is saving correctly but Mongo auto generates an _id
field every time so technically none of the objects are unique and the objects are repeatedly added.
Is anyone aware of a workaround for this?
CodePudding user response:
You could check if a bank already exists, and add it only if not present:
exports.createPayment = async (req, res) => {
const { user, cardHolder, cardNumber, expiry, cvc, cardBrand } = req.body;
const existingBank = await User.findOne({
'bankDetails.cardHolder': cardHolder,
'bankDetails.cardNumber': cardNumber,
'bankDetails.expiry': expiry,
'bankDetails.cvc': cvc,
'bankDetails.cardBrand': cardBrand,
});
if (existingBank) return res.json(existingBank);
const saveDetails = await User.findByIdAndUpdate(
user._id,
{
$addToSet: {
bankDetails: {
cardHolder,
cardNumber,
expiry,
cvc,
cardBrand,
},
},
},
{ new: true }
).exec();
res.json(saveDetails);
};