Search code examples
angularjsnode.jsmongodbmongoosemongoose-schema

Mongoose: 'Cast to embedded failed for value at path. Cannot use 'in' operator to search for '_id'


I'm having some trouble trying to save an array inside an array of objects.

I'm getting the following response from the server:

{ [CastError: Cast to embedded failed for value "\'maxbeds: 4\'" at  path "saved_searches"]
message: 'Cast to embedded failed for value "\\\'maxbeds: 4\\\'" at path "saved_searches"',
name: 'CastError',
kind: 'embedded',
value: '\'maxbeds: 4\'',
path: 'saved_searches',
reason: [TypeError: Cannot use 'in' operator to search for '_id' in maxbeds: 4] }

Here's my Schema:

var mongoose = require('mongoose'),
rfr = require('rfr'),
passwordHelper = rfr('server/helpers/password.js'),
Schema = mongoose.Schema,
_ = require('lodash');

/*
* 
* Creating UserSchema for MongoDB
*
*/

var UserSchema = new Schema({
 email: {
  type: String,
  required: true,
  unique: true
},
password: {
  type: String,
  required: true,
  select: false
},
name: {
  type: String,
  required: true
},
passwordSalt: {
  type: String,
  required: true,
  select: false
},
saved_houses: [{
  mlsId: {
    type: String
  },
  addressFull: {
    type: String
  },
  bedrooms: {
    type: Number
  },
  listPrice: {
    type: Number
  },
  bathrooms: {
    type: Number
  },
  sqft: {
    type: Number
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
}],
saved_searches: [{
  search_name: {
    type: String
  },
  filters: {
    type: [Schema.Types.Mixed]
  },
  createdAt: {
    type: Date,
    default: Date.now
  }
}],
active: {
  type: Boolean,
  default: true
},
createdAt: {
  type: Date,
  default: Date.now
}
});
// compile User model
module.exports = mongoose.model('User', UserSchema);

The problem, I believe is the filters array that live inside an object inside the saved_searches array

Now, in my router I do the following:

var express = require('express'),
savedDataRouter = express.Router(),
mongoose = require('mongoose'),
rfr = require('rfr'),
s = rfr('server/routes/config/jwt_config.js'),
User = rfr('server/models/User.js'),
jwt = require('jsonwebtoken');

savedDataRouter.post('/searches', function (req, res) {
  if (mongoose.Types.ObjectId.isValid(req.body.userId)) {
      User.findByIdAndUpdate({
              _id: req.body.userId
          }, {
              $push: {
                  saved_searches: {
                      search_name: req.body.search_name,
                      $each: req.body.filters
                  }
              },
          }, {
              new: true
          },
          function (err, doc) {
              if (err || !doc) {
                  console.log(err);
                  res.json({
                      status: 400,
                      message: "Unable to save search." + err

                  });
              } else {
                  return res.json(doc);
              }
          });
  } else {
      return res.status(404).json({
          message: "Unable to find user"
      });
  }
});

If I log the request body coming from the client I get the following:

//console.log(req.body)
{ search_name: 'Sarasota',
filters: [ 'minbaths: 1', 'maxbaths: 3', 'minbeds: 2', 'maxbeds: 4' ],
userId: '583359409a1e0167d1a3a2b3' }

I've tried all the things I've seen in Stack Overflow and other online resources with no luck. What am I doing wrong?

Edit

Added module dependencies to my UserSchema and SavedDataRouter


Solution

  • try this

    User.findByIdAndUpdate({
              _id: req.body.userId
          }, {
              $push: {
                  saved_searches: {
                      search_name: req.body.search_name,
                      filters: req.body.filters
                  }
              },
          }, {
              new: true
          },
          function (err, doc) {
              if (err || !doc) {
                  console.log(err);
                  res.json({
                      status: 400,
                      message: "Unable to save search." + err
    
                  });
              } else {
                  return res.json(doc);
              }
          });