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:
JavaScript
x
14
14
1
const userSchema = new mongoose.Schema(
2
{
3
bankDetails: [
4
{
5
cardHolder: String,
6
cardNumber: String,
7
expiry: String,
8
cvc: String,
9
cardBrand: String,
10
},
11
]
12
}
13
)
14
I am updating the schema using the following controller function:
JavaScript
1
18
18
1
exports.createPayment = async (req, res) => {
2
const { user, cardHolder, cardNumber, expiry, cvc, cardBrand } = req.body
3
const saveDetails = await User.findByIdAndUpdate(
4
{ _id: user._id },
5
$addToSet: {
6
bankDetails: {
7
cardHolder,
8
cardNumber,
9
expiry,
10
cvc,
11
cardBrand,
12
},
13
},
14
{ new: true }
15
).exec();
16
res.json(saveDetails);
17
}
18
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?
Advertisement
Answer
You could check if a bank already exists, and add it only if not present:
JavaScript
1
28
28
1
exports.createPayment = async (req, res) => {
2
const { user, cardHolder, cardNumber, expiry, cvc, cardBrand } = req.body;
3
const existingBank = await User.findOne({
4
'bankDetails.cardHolder': cardHolder,
5
'bankDetails.cardNumber': cardNumber,
6
'bankDetails.expiry': expiry,
7
'bankDetails.cvc': cvc,
8
'bankDetails.cardBrand': cardBrand,
9
});
10
if (existingBank) return res.json(existingBank);
11
const saveDetails = await User.findByIdAndUpdate(
12
user._id,
13
{
14
$addToSet: {
15
bankDetails: {
16
cardHolder,
17
cardNumber,
18
expiry,
19
cvc,
20
cardBrand,
21
},
22
},
23
},
24
{ new: true }
25
).exec();
26
res.json(saveDetails);
27
};
28