1

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

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"'。我尝试了各种可能的方式来查询我的文档,但没有运气。有任何想法吗?

4

3 回答 3

2

问题是你需要为你的模型定义一个模式来告诉 Mongoose 你的_id字段是 a而不是这个集合String中的标准:ObjectId

AccountSchema = new mongoose.Schema
    _id: String
    profile:
        available: Boolean
Account = mongoose.model 'users', AccountSchema
于 2013-07-11T19:23:40.233 回答
1

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

id objectid,或可以强制转换为 1 的值

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

account = Account.findOne { "_id" : req.params.account_id }
于 2013-07-11T14:20:59.850 回答
1

当前传播的答案不是一个好主意。不要更改模型的架构来告诉 Mongoose 你的 _id 字段是一个字符串。就验证而言,这是一个坏主意,应该被视为一种黑客行为。

试试这个:如果你想在 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) });
于 2013-07-23T13:55:59.580 回答