2013-07-11 3 views
1

유성 어플리케이션에 mongodb를 저장하고 있는데, API를 통해 REST를 통해 만들고 공개하고 싶습니다.Mongoosejs가 findById를 사용하여 쿼리 할 수 ​​없습니다.

express = require 'express' 
mongoose = require 'mongoose' 

app = express() 

mongoose.connect process.env.MONGO_URL 

Account = mongoose.model 'users', 
    profile: 
     available: Boolean 

app.get "/accounts/meta/:account_id", (req, res) -> 
    account = Account.findById req.params.account_id 
    , (error, account) -> 
     if account? 
      res.jsonp 
       account: account 
     else 
      res.jsonp 404, 
       error: "Account not found" 

app.listen 2000 

문제는 내 데이터베이스에서 볼 수있는 ID로 쿼리 할 수 ​​없다는 것입니다. 내가 /accounts/meta/zcdsHuKr5dTh3xHz5에 가면

{ 
    "_id": "zcdsHuKr5dTh3xHz5", 
    "createdAt": 1373188729653, 
    "last_seen": 1373465529548, 
    "profile": { 
     .... 

그것이 'Cast to ObjectId failed for value "zcdsHuKr5dTh3xHz5" at path "_id"'을 말한다 예를 들어 나는이 사용자를 가지고있다. 행운없이 내 문서를 쿼리 할 수있는 모든 방법을 시도했습니다. 어떤 아이디어?

+0

문서의 ID는 ObjectId입니까? –

+0

그것은 데이터베이스 자체에서 가져온 문자열입니다. 그것이 객체 ID라고 생각하지 마십시오. 나는 여전히 몽고에 대해 새로운 사람이다. –

답변

2

문제는 당신이 당신의 _id 필드가 String 대신 표준 ObjectId에서입니다 몽구스 말할 모델에 대한 스키마를 정의 할 필요가있다 이 컬렉션 :

AccountSchema = new mongoose.Schema 
    _id: String 
    profile: 
     available: Boolean 
Account = mongoose.model 'users', AccountSchema 
+0

고맙습니다. 내 응용 프로그램의 낮은 필요성을 감안할 때 승려와 함께 갔지만 이것이 정답입니다. –

1

_id 필드가 ObjectId가 아닌 것 같습니다. 몽구스의 방법 findById는 기대 :

아이디 OBJECTID 경우, 또는,

그래서 하나를 주조 할 수있는 값은 사실 _id 당신이 findOne 방법을 사용하여 쿼리 할해야 ObjectId가 아니다

account = Account.findOne { "_id" : req.params.account_id } 
+0

동일한 오류로 인해 실패합니다. ''{메시지 : 'CastError', 유형 : 'ObjectId가' 값 : 'zcdsHuKr5dTh3xHz5', 경로 '_id', 이름을 'ObjectId가로 캐스트 경로 "_id"에서 값 "zcdsHuKr5dTh3xHz5"실패'} –

+0

계정 스키마는 어떻게 정의됩니까? –

+0

기본 'Account = mongoose.model ('accounts ');' –

1

현재 전파 대답은 좋은 생각이 아니다. Mongoose에게 _id 필드가 String임을 알려주도록 모델의 스키마를 변경하지 마십시오. 이는 유효성 검사 측면에서 나쁜 아이디어이며 해킹으로 간주되어야합니다.

대신을 시도 당신은 몽구스의 _id를 조회하려면 Mongoosejs뿐만 아니라 쿼리의 ID를 캐스팅 할 필요

AccountSchema = new mongoose.Schema({ 
    _id: ObjectID(), 
    profile: { 
     available: Boolean 
    }); 
Account = mongoose.model('users', AccountSchema); 

은 (I didn를

, 당신은 ObjectId가에 _id를 캐스팅해야 몽구스 문서에서 이것에 대해 아무 것도 없습니다) :

account = Account.findOne({ "_id" : mongoose.Types.ObjectId(req.params.account_id) }); 
+0

OP의 경우, 그의 문서의'_id' 값은 ObjectIds가 아닌 문자열이기 때문에 스키마의'_id'는 문자열이어야합니다. 또한 Mongoose가 당신을 대신해서 보여 주듯이'_id' 값을 ObjectId에 던질 필요가 없습니다. – JohnnyHK

관련 문제