sinusGob
sinusGob

Reputation: 4313

How do i $set and $push in one update MongoDB?

I'm trying to $push and $set at the same time, $push is working just fine, when it comes to $set, it generates this error:

MongoError: The positional operator did not find the match needed from the query. Unexpanded update: files.$.name

Here's the code

Course.update(
    {
        _id: req.body.courseId,
        'files.fileUrl': { $ne: url }
    },{
        $push: { files: { fileUrl: url } },
        $set: {'files.$.name': file.name},
    }, function(err, count) {
        if (err) return next(err);
        console.log("Successfully saved")
    });

and the ORM model, I'm using mongoose

var CourseSchema = new Schema({
    files: [{
        fileUrl: String,
        name: { type: String, default: 'File name'}
    }]
});

Any help would be appreciated. Thanks.

Upvotes: 3

Views: 6653

Answers (2)

coding_idiot
coding_idiot

Reputation: 13734

As the error states looks like the query used is returning no documents or returning documents having no files[].

Another reason for which it might be throwing error is that you're trying to $push & $set in the same field files and probably running into an issue similar to https://jira.mongodb.org/browse/SERVER-1050

IMHO, there is no good reason to use the same field in $push & $set, instead you can simply change

$push: { files: { fileUrl: url } },
$set: {'files.$.name': file.name},

to

$push: { files: { fileUrl: url, name: file.name } },

Upvotes: 3

Shikha thakur
Shikha thakur

Reputation: 1289

I have written similar kind of query for my project Hope u could relative this to your scenario

exports.candidateRating = function(req, res) {
console.log(req.query);
console.log(req.body.RoundWiseRatings);
Profiles.update({
    "name": req.query.name
}, {
    $set: {
        "ratings": req.body.ratings,
    },
    $push: {
        "RoundWiseRatings": req.body.RoundWiseRatings
    }
}, {
    multi: true
}, function(error, profiles) {

    if (error) {

    }
    return Profiles.find({
        name: req.query.name
    }, function(err, profiless) {
        console.log(profiless);
        if (err) {
            return handleError(res, err);
        }
        return res.status(200).json(fnStruncturedData(profiless[0].RoundWiseRatings));
    });

});};

And this worked for me :)

Upvotes: 0

Related Questions