Firstly, here is my document:
{
"_id" : "Members",
"Member_Index" : [
"wCwam8zqotSSMeyDwOfEfmMhZFn2",
"wpbcaIFEMeds3HmM2JOmIz05RGq1",
"imbb0r1aOhMzFnHCDWKBiLhSTr03",
"mzle6EjxNHVIrySiVo90ftyK2jC3",
"j8xP1GzeEIRM0Oq07g7b1vgSpPv1"
],
"Classes" : [
{
"date" : ISODate("2017-08-30T05:00:21.437Z"),
"className" : "Run",
"_id" : "1504069221437",
"registeredMembers" : []
}
]}
I am trying to push (append) a string into the Classes.ARRAY_INDEX.registeredMembers array. I am able to update the index 0 with this:
gym.findByIdAndUpdate("Members",
{$push: {'Classes.0.registeredMembers': req.query.UID}},
{safe: true, upsert: true}, function(err, model) {
if (model != null) {
console.log('Updated with UID');
res.sendStatus(200);
} else {
console.log('Failed to update');
console.log(err);
res.status(404).send('Failed to update')
}
});
I would like to change the index (which I know from another query). I tried passing in a concatenated string in the field parameter; however, it expects an object.
var param = 'Classes.' + index + '.registeredMembers';
Passing in the above variable in place of 'Classes.0.registeredMembers' results in the following error:
Error: Invalid atomic update value for $push.
Any tips/pointers would be greatly appreciated! Please let me know if you need more info.
Here is the full function:
router.get('/register_class', function(req, res, next) {
if (!req.query.token || !req.query.UID || !req.query.GID || !req.query.EID) {
console.log('Invalid Params');
res.status(404).send('Invalid Parameters');
return null;
}
checkAuth(req.query.token, function(authed){
if (!authed) {
console.log('Invalid token passed. Permission Denied');
res.send('Unauthorized');
return;
}
});
console.log('Valid Access');
gid.findOne( {'GID': req.query.GID}).exec(function(err, GID) {
if (err) {
return res.send("Error");
} else {
if (GID == null) {
res.status(404).send('Invalid GID');
} else {
var GCOL = GID.GCOL;
var gym = require('../models/gym.js')(GCOL, randomstring.generate(32));
if (!gym) {
console.log('Invalid Collection Name');
res.status(404).send('Invalid Parameters')
return null;
}
console.log('Valid Collection');
gym.findOne( {'_id': "Members"}).exec(function(err, UID) {
if (err) {
return res.send(err);
} else {
if (UID == null) {
res.status(404).send('Invalid UID');
} else {
var classesArray = UID.Classes;
for (i = 0; i < classesArray.length; i++) {
if (classesArray[i]._id == req.query.EID) {
var where = ["Classes." + i + ".registeredMembers"];
console.log('Where: ' + where);
var queryParam = {where : req.query.UID};
gym.findByIdAndUpdate("Members",
{$push: {'Classes.0.registeredMembers': req.query.UID}},
{safe: true, upsert: true}, function(err, model) {
if (model != null) {
console.log('Updated with UID');
res.sendStatus(200);
} else {
console.log('Failed to update');
console.log(err);
res.status(404).send('Failed to update')
}
});
};
};
}
}
});
}
}
});
});
Thanks to Neil Lunn for pointing me the right direction!
This works:
var where = ["Classes." + i + ".registeredMembers"];
obj = { [where]: req.query.UID };
gym.findByIdAndUpdate("Members", {$push: obj},
{safe: true, upsert: true}, function(err, model) {
if (model != null) {
console.log('Updated with UID');
res.sendStatus(200);
} else {
console.log('Failed to update');
console.log(err);
res.status(404).send('Failed to update')
}
});
};