Simeon Nakov
Simeon Nakov

Reputation: 1048

.updateOne on MongoDB not working in Node.js

I have the following code:

connection((db) => {
            db.collection('orders')
                .updateOne(
                    { "_id": req.body._id}, // Filter
                    {"name": req.body.name} // Update
                )
                .then((obj) => {
                    console.log('Updated - ' + obj);
                    res.redirect('orders')
                })
                .catch((err) => {
                    console.log('Error: ' + err);
                })
        })

I want to change the name in the order but it doesn't update it. The result in the console is

Updated - {"n":0,"nModified":0,"ok":1}

I tried to read the documentation but it's horrific

EDIT: {$set: {"name": req.body.name}}, didn't work as well

EDIT 2: The passed ID matches the _id in the database. Could it be a problem that I'm querying for plain text ID while in the database it is referred to as "ObjectId('5a42ja...')"

Upvotes: 42

Views: 98994

Answers (9)

Mahesh
Mahesh

Reputation: 41

after spending couple of hours on it I found out that for update I had to convert the id value to Integer, this was however not required where only find was being used

dbCollection.updateOne({ _id: parseInt(reqBody.id) }

Upvotes: -1

Victor Vargas
Victor Vargas

Reputation: 81

The correct syntax is:

monDb.collection.updateOne(
    {"_id": ObjectId(req.params.id)}, 
    { $set: updateDoc }, 
    function(err, doc) {
      ...
    }
);

UPDATE: Not ObjectID but ObjectId.

Upvotes: 8

Luis Moreno
Luis Moreno

Reputation: 723

En NEXT.js

My project is on React and Next.js. I had this issue. My silly solution was Restart with (next dev) xD

I added two fields to my Schema model and I tried to update that new fields, but did not works until i restart mi project.

I hope to save time for someone. :)

Upvotes: -1

Yuvaraj Anbarasan
Yuvaraj Anbarasan

Reputation: 657

This might happen if the collection schema is missing the field that is to be updated. If the schema is not strict (i.e, isStrict: false), check the update operator. In some cases, the new update value can be same as existing value. In this case, mongoose returns

{ n: 1, nModified: 0, ok: 1 }

Upvotes: 5

David Cardoso
David Cardoso

Reputation: 1

I had this trouble too, I create a constant with _id from req.body

const {_id} = req.body  //pass ID user
await User.updateOne({_id},{$set:data}, (err)=>{
            if(err) return res.status(200).json({
                error: true,
                code: 115,
                message: "Erro to update user!"
            })
        })

Upvotes: -1

maiko
maiko

Reputation: 405

For me, I have to delete the "_id"/id field before passing the object in the update.

Or it will say that the field is invalid.

Obviously, updated the key while you're using it as a reference isn't the best thing to do.

Upvotes: 1

MajidJafari
MajidJafari

Reputation: 1110

Tough @Spraw's answer is right for some cases, but sometimes it doesn't work. I think the convenient answer is updateOne({_id: new ObjectID(req.body._id)}, {$set: {"name": req.body.name}}, callback).

the _id in mongodb is a BSON object and should be instantiated.

Upvotes: 4

Sparw
Sparw

Reputation: 2743

Maybe you should use "$set" in your update query like this :

{$set: {"name": req.body.name}}, // Update

More information in documentation

EDIT

If it doesn't work, this is probably because there is no match with your filter.

Maybe you should try to match with an ObjectId like this :

var ObjectID = require('mongodb').ObjectID;

// In your request
{ "_id": ObjectID(req.body._id)}, // Filter

Hope it helps.

Upvotes: 71

Dan Porat
Dan Porat

Reputation: 436

Use {$set: {"name": req.body.name}} (as Sparw mentioned) to update the the properties you want in the document. Also, if the id that you pass as a parameter does not exists in the collection (and you want to create one with the same id) you can pass as a third parameter {upsert: true} to create one.

In your example:

connection((db) => {
          db.collection('orders')
               .updateOne(
                  { "_id": req.body._id}, // Filter
                  {$set: {"name": req.body.name}}, // Update
                  {upsert: true} // add document with req.body._id if not exists 

             )
            .then((obj) => {
               console.log('Updated - ' + obj);
              res.redirect('orders')
         })
        .catch((err) => {
           console.log('Error: ' + err);
      }) })

Upvotes: 11

Related Questions