对于带有mongoose的值“ObjectId”,转换为ObjectId失败

时间:2017-05-24 00:38:10

标签: node.js mongodb mongoose

我需要使用mongoose find方法和“_id”而不是findById。

在我的路由器中,我从前端应用程序收到了正确的字符串“_id”:

req.query.where="591f47d10d957323386f0c42".

使用robomongo,下一步效果很好:

db.getCollection('ag_escalaatendimentos').find({'_id':ObjectId('59247524723dec26aca239ed')})

但是当我运行应用程序时出现错误:

我的错误是:

"ObjectId" message:"Cast to ObjectId failed for value "ObjectId {↵  path: '591f47d10d957323386f0c42',↵  instance: 'ObjectID',↵  validators: [],↵  setters: [],↵  getters: [],↵  options: undefined,↵  _index: null }" at path "_id" for model "Ag_escalaatendimento""
name:
"CastError" path:"_id" stringValue: ""ObjectId {path: '591f47d10d957323386f0c42',  instance: 'ObjectID',  validators: [],  setters: [],  getters: [],  options: undefined,↵  _index: null }""

//代码

'use strict';
const express = require('express');
const router = express.Router();
const Ag_escalaatendimento = require('../models/ag_escalaatendimento');

const callback=function(err,data,res){
         //if (err) console.log(err);
         if (err) return res.status(500).json(err);
         return res.status(200).send(data);
    }   



//get all

router.get('/',function(req,res,next){  
        var mongoose = require('mongoose');
        var ObjectId = mongoose.Schema.Types.ObjectId;

        //Here I have req.query.where: "591f47d10d957323386f0c42".
        var qrySearch={"_id": new ObjectId(req.query.where)};
            Ag_escalaatendimento.find(qrySearch)
            .exec( (err,data) => {
               callback(err,data,res)
            })
        });

1 个答案:

答案 0 :(得分:1)

正如Neil在评论中提到的,Mongoose会在适当时自动将字符串转换为ObjectId。但是,问题的根本原因是您使用的是错误的ObjectId类。 Mongoose实际上提供了两个具有相同名称的不同类:

  • mongoose.Schema.Types.ObjectId
  • mongoose.Types.ObjectId

在定义模式时应使用第一个,在为查询显式创建ObjectId时应使用第二个。替换您定义ObjectId的一行会修复您的代码:

var mongoose = require('mongoose');
var ObjectId = mongoose.Types.ObjectId;

//Here I have req.query.where: "591f47d10d957323386f0c42".
var qrySearch={"_id": new ObjectId(req.query.where)};
    Ag_escalaatendimento.find(qrySearch)
    .exec( (err,data) => {
       callback(err,data,res)
    })
});
相关问题