Mongoosejs无法使用findById进行查询

时间:2013-07-11 13:59:27

标签: mongodb express coffeescript mongoose meteor

我有一个流星应用程序保存到mongodb的东西,我有一个api我希望通过REST制作和曝光。

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"'。我试着用一切可能的方法来查询我的文件而没有运气。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

问题在于您需要为模型定义架构,以告知Mongoose您的_id字段是String而不是此集合中的标准ObjectId

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

答案 1 :(得分:1)

似乎您的_id字段不是ObjectId。 Mongoose上的方法findById期望:

  

id objectid,或者可以转换为一个

的值

因此,如果您的_id实际上不是ObjectId,则应使用findOne方法进行查询

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

答案 2 :(得分:1)

目前传播的答案不是一个好主意。不要更改模型的模式以告诉Mongoose您的_id字段是String。在验证方面这是一个坏主意,应该被认为是一个黑客。

试试这个: 如果要在mongoose中查询_id,则必须将_id强制转换为ObjectId

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

Mongoosejs要求你在查询中强制转换id(我也没有在mongoose文档中找到任何关于它的内容):

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