Valip
Valip

Reputation: 4650

Mongoose update returns undefined

How can I update a field with new properties that is initially set to be an empty object?

For example, I have the following schema:

import mongoose from 'mongoose';

var RunSchema = mongoose.Schema(
  {
    runId: { type: String },
    reports: {
      cookieSummary: {
        name: String,
        path: String
      }
    }
  }
)

export default mongoose.model('Run', RunSchema);

And I'm trying to update the following document:

{
    "_id": {
        "$oid": "5a0565c2537e0b5d9d08ee6b"
    },
    "__v": 0,
    "reports": {},
    "runId": "8r4LNN3fRqd3qNgdW"
}

But when I run this code, it returns undefined:

  Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
  {
    $set: {'reports.cookieSummary': { 'name': 'test' }},
  }, (err, doc) => { console.log(doc) })

The object notation works after adding type to fields, like this: name: { type: String }

Upvotes: 0

Views: 618

Answers (4)

Marcio.Torquato
Marcio.Torquato

Reputation: 116

I made a small change. Test this solution.

    Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
    {
        $set: {"reports": {'cookieSummary':{'name': 'test'}}},
    }, (err, doc) => { console.log(doc) })

Upvotes: 0

Paras Wadhwa
Paras Wadhwa

Reputation: 64

Try using below code, it will update the document and return the updated document.

var Q = require('q');

var deferred = Q.defer();
Run.findOneAndUpdate({ runId: '8r4LNN3fRqd3qNgdW' }, { $set: { 'reports.cookieSummary.name': 'test' } }, { new: true },
    (err, doc) => {
        console.log(doc);
        deferred.resolve(doc);
    });
return deferred.promise;

Upvotes: 0

Elmer Dantas
Elmer Dantas

Reputation: 4869

Try to use dot notation, as you're setting just one field:

  Run.findOneAndUpdate(
   { runId: '8r4LNN3fRqd3qNgdW' }, 
   { $set: {'reports.cookieSummary.name': 'test' } },
   (err, doc) => { console.log(doc) })

According to the docs, the command you're using should work but you write it wrongly. Try like this:

 Run.findOneAndUpdate(
  { runId: '8r4LNN3fRqd3qNgdW' }, 
  { $set: { 'reports.cookieSummary': {'name': 'test'} } },
  (err, doc) => { console.log(doc) })

if it does not work, maybe mongo expect that the object matches its schema when you use the command like this. But I don't think so.

Let me know.

Upvotes: 1

Rajan
Rajan

Reputation: 1

Your query for update a document is good only the mistake is at the end of curly braces of $set. You entered un-necessary comma at the end that is actually creating problem in this case. So I suggest you to remove it and run this :

Run.findOneAndUpdate({runId: '8r4LNN3fRqd3qNgdW'}, 
{
$set: {'reports.cookieSummary': { 'name': 'test' }}
}, (err, doc) => { console.log(doc) });

and then see. Rest of your query is fine.

Hope It will work for you. Thanks.

Upvotes: 0

Related Questions