2013-07-11 22 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進行查詢。例如,我有這樣的用戶:

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

如果我去/accounts/meta/zcdsHuKr5dTh3xHz5它說'Cast to ObjectId failed for value "zcdsHuKr5dTh3xHz5" at path "_id"'。我儘可能地嘗試查詢我的文檔,但沒有運氣。有任何想法嗎?

+0

您的文檔的ID是ObjectId嗎? –

+0

這只是我從數據庫本身取得的字符串。不要以爲它是一個對象ID。我對mongo仍然很陌生。 –

回答

2

的問題是,你需要定義一個架構模型告訴貓鼬,你_id字段是String,而不是在標準ObjectId此集合:

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

謝謝先生。考慮到我的應用程序的低需求,我和僧人去了,但這是正確的答案。 –

1

似乎你的_id字段不是ObjectId。在貓鼬的方法findById預計:

ID OBJECTID,或可如果被強制轉換爲一個

因此,值你_id其實不是的ObjectId,您應該查詢中使用findOne方法

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

這將失敗並出現相同的錯誤。 '{消息: '投射到的ObjectId爲值 「zcdsHuKr5dTh3xHz5」 在路徑 「_id」 失敗', 名: 'CastError', 類型: '的ObjectId', 值: 'zcdsHuKr5dTh3xHz5', 路徑: '_id'}' –

+0

如何定義您的賬戶模式? –

+0

這是基本'帳戶= mongoose.model('帳戶');' –

1

當前傳播的答案不是一個好主意。不要更改模型的模式,以告訴Mongoose您的_id字段是一個字符串。在驗證方面這是一個糟糕的主意,應該被認爲是黑客行爲。

試試這個: 如果你想查詢的貓鼬的_id,您必須將_id投來的ObjectId

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

Mongoosejs需要你投中的id查詢,以及(我沒在貓鼬文檔中找不到任何關於此的內容):

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

在OP的情況下,模式中的_id'需要是一個字符串,因爲他的文檔中的_id值是字符串,而不是ObjectIds。另外,你不需要像Mongoose那樣爲你顯示'_id'值給ObjectIds。 – JohnnyHK