Mongoose:'投射到嵌入的路径值失败。无法使用“in”运算符搜索“_id”

Posted

技术标签:

【中文标题】Mongoose:\'投射到嵌入的路径值失败。无法使用“in”运算符搜索“_id”【英文标题】:Mongoose: 'Cast to embedded failed for value at path. Cannot use 'in' operator to search for '_id'Mongoose:'投射到嵌入的路径值失败。无法使用“in”运算符搜索“_id” 【发布时间】:2017-04-05 08:57:19 【问题描述】:

我在尝试将数组保存在对象数组中时遇到了一些问题。

我从服务器收到以下响应:

 [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] 

这是我的架构:

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);

我认为问题在于位于 saved_searches 数组中的对象内的过滤器数组

现在,在我的路由器中,我执行以下操作:

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"
      );
  
);

如果我记录来自客户端的请求正文,我会得到以下信息:

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

我已经尝试了我在 Stack Overflow 和其他在线资源中看到的所有内容,但没有成功。我做错了什么?

编辑

向我的 UserSchema 和 SavedDataRouter 添加了模块依赖项

【问题讨论】:

你能详细说明你想要达到的目标吗?正确的 saved_search 对象应该是什么? @Gurbakhshish Singh 很好,我基本上试图传递 2 个参数:search_name 是一个字符串,filters 是一个字符串数组。我想要做的是让我的数据库寻找正确的用户并将这些信息嵌入到一个名为 saved_searches 的对象数组中。这样一个成功的帖子看起来像 saved_searches:search_name:'some string', filters: [array_of_strings] 【参考方案1】:

试试这个

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);
          
      );

【讨论】:

这更有意义。我因为忘记引用发送文件管理器的字段而感到愚蠢。但是,我现在遇到了一个不同的错误 =“\'saved_searches..filters.0.$each\' 中的美元 ($) 前缀字段 \'$each\' 对存储无效/”,我正在研究什么它可能是。 就是这样!谢谢!现在我开始了解数组在 mongo 中是如何工作的。

以上是关于Mongoose:'投射到嵌入的路径值失败。无法使用“in”运算符搜索“_id”的主要内容,如果未能解决你的问题,请参考以下文章

无法将嵌入的影片剪辑投射到影片剪辑类型

Mongoose:CastError:在路径“_id”处为值“[object Object]”转换为 ObjectId 失败

Mongoose,解析嵌入式数组中的路径

由于 Mongoose findOne 中的值错误,转换为 ObjectId 失败

模型错误的路径值转换为 ObjectId 失败

Mongoose ValidationError:验证失败:需要路径