Maybe it is a bug in sequelize, I just opened an issue there.
I suppose raw option makes Sequelize to return plain query results without grouping them (that's why it's called "raw"). So that means that if you have two child records for each main record then you'll end up with N*2 objects returned by Sequelize.
If you wish to get plain objects instead of Sequelize model instances just call get({ plain: true}) for each of model instances:
const cart = await Cart.findOne({
...
})
const plainCart = cart.get({ plain: true})