2017-05-24 77 views
0

我需要使用「_id」而不是findById來使用mongoose查找方法。強制轉換爲ObjectId的值爲「ObjectId」並伴有貓鼬

在我的路由器,我收到一個正確的字符串「_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) 
      }) 
     }); 
+0

'querySearch = {「_id」:req.query.where}'。貓鼬會爲你做。這就是說,我沒有理由爲什麼你不能'.findById(req.query.where)' –

+0

@ Neil Lunn你的建議querySearch沒有返回任何文件。我已經嘗試過了。正如你在我的文章中看到的,robomango返回一個文件。 –

+0

顯示您認爲應該檢索的文檔。文本輸出,而不是一個截圖請。如果您可能重寫'_id'的定義,那麼還包括您的模式定義。一般的原因是數據庫中的值實際上不是「ObjectId」而是「字符串」(通常來自錯誤代碼)。或者確實沒有文件可以匹配。 –

回答

1

尼爾在評論中提到的,貓鼬會自動串在適當的時候轉換爲ObjectId秒。但是,問題的根本原因是您使用了錯誤的ObjectId類。貓鼬實際上提供了兩個不同的類具有相同的名稱:

  • 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) 
    }) 
}); 
+0

謝謝,感謝你的建議。 –