0

I want to add a new data object inside of a nested document in MongoDB. this is what my schema look like :

const transactionSchema = new Schema({
  transactionType: {type: String, require: true, trim: true},
  senderWallet: {type: String, require: true, trim: true},
  recipientWallet: {type: String, require: true, trim: true},
  amount: {type: Number, require: true, trim: true},
  createdAt: {type: Date, require: true},
});

const walletHoldShema = new Schema({
  balance: {type: Number},
  transaction:[transactionSchema]

});


const walletSchema = new Schema({
  createdAt: {type: Date, require: true},
  userId: {type: String, require: true, trim: true},
  walletAdrress: {type: String},
  usdWallet: [walletHoldShema],

})

const Wallets = mongoose.model('wallet', walletSchema);

module.exports = Wallets

This is what my data look like right now

wallet: {
                "_id": "60ca5e8e2c57463733b65f89",
                "usdWallet": [
                    {
                        "_id": "60ca5ede2c57463733b65f8a",
                        "balance": 0,
                        "transaction": []
                    }
                ],
                "createdAt": "2021-06-16T20:28:14.589Z",
                "userId": "fb0df5c9a9eb",
                "walletAdrress": "fb0df5c9a9eb",
                "__v": 0
            }

I have tried different solution like this one which I followed via stack :

const _id = req.params._id;  

            const transactionInput = {
                transactionType: 'input',
                senderWallet: req.body.sender,
                recipientWallet: req.body.recipient,
                amount: req.body.amount,
                createdAt: Date.now(),
            };

            walletSchema.findOneAndUpdate({_id: _id}, {$push: {transaction: transactionInput}}, { new: true }, function(err, data){
                if (err) {
                    res.send(err);
                } else {
                    res.send(transactionInput);
                }
            });

// calling router 
router.patch('/v1/sendUSD/', wallet.sendDollar

But I am getting this in my DB after my router is called :

"wallet": [
              {
                "_id": "60ca5e8e2c57463733b65f89",
                "usdWallet": [
                    {
                        "_id": "60ca5ede2c57463733b65f8a",
                        "balance": 0,
                        "transaction": []
                    }
                ],
                "createdAt": "2021-06-16T20:28:14.589Z",
                "userId": "fb0df5c9a9eb",
                "walletAdrress": "fb0df5c9a9eb",
                "__v": 0
            },

            {
                "_id": "60ca5e8e2c5746373",
                "usdWallet": [
                    {
                        "_id": "60ca5ede2c57463733b65f8a",
                        "transaction": 
                        [
                            {
                              "transactionType": "input",
                              "senderWallet": "fcdhjgknsdfihber",
                              "recipientWallet": "mbindu",
                              "amount": "50.0",
                              "createdAt": 1623881009306
                            }
                        ]
                    }
                ],
           
            },


]

But what I want is this :

wallet: [
              {
                "_id": "60ca5e8e2c57463733b65f89",
                "usdWallet": [
                    {
                        "_id": "60ca5ede2c57463733b65f8a",
                        "balance": 0,
                        "transaction":
                         [
                            {
                              "transactionType": "in",
                              "senderWallet": "fcdhjgknsdfihber",
                              "recipientWallet": "mbindu",
                              "amount": "50.0",
                              "createdAt": 1623881009306
                            },
                            {
                              "transactionType": "out",
                              "senderWallet": "fcdhjgknsdfihber",
                              "recipientWallet": "mbindu",
                              "amount": "50.0",
                              "createdAt": 1623881009306
                            },

                        ]
                    }
                ],
                "createdAt": "2021-06-16T20:28:14.589Z",
                "userId": "fb0df5c9a9eb",
                "walletAdrress": "fb0df5c9a9eb",
                "__v": 0
            },
]
2
  • 1
    Does this answer your question? Mongodb $push in nested array Commented Jun 17, 2021 at 3:55
  • Yes rohanraj it does. Thank you Commented Jun 17, 2021 at 19:11

1 Answer 1

1

having an array inside an array is always a bad idea. that said, you can push transaction into usdWallet through:

walletSchema.findOneAndUpdate({ _id: _id }, { $push: { "usdWallet.$.transaction": transactionInput }}, { new: true }, function(err, data) {
  if (err) {
    res.send(err); 
  } else {
      res.send(transactionInput);
  }
});
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.