【问题标题】:Mongoosejs can't query with findByIdMongoosejs 无法使用 findById 进行查询
【发布时间】:2013-07-09 20:18:36
【问题描述】:

我有一个流星应用程序将东西保存到 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"'。我尝试了各种可能的方式来查询我的文档,但没有运气。有什么想法吗?

【问题讨论】:

  • 您的文档的 ID 是 ObjectId 吗?
  • 这只是我从数据库本身获取的字符串。不要认为这是一个对象ID。我还是 mongo 的新手。

标签: mongodb express coffeescript mongoose meteor


【解决方案1】:

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

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

【讨论】:

  • 谢谢先生。考虑到我的应用程序的低需求,我和和尚一起去了,但这是正确的答案。
【解决方案2】:

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

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

所以,如果您的 _id 实际上不是 ObjectId,您应该使用 findOne 方法查询

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

【讨论】:

  • 这失败并出现同样的错误。 { message: 'Cast to ObjectId failed for value "zcdsHuKr5dTh3xHz5" at path "_id"', name: 'CastError', type: 'ObjectId', value: 'zcdsHuKr5dTh3xHz5', path: '_id' }
  • 如何定义您的帐户架构?
  • 基本Account = mongoose.model('accounts');
  • 完全一样的代码适用于和尚:github.com/LearnBoost/monk很奇怪
  • 我的意思是_id字段,schema上是怎么定义的?
【解决方案3】:

当前传播的答案不是一个好主意。不要更改模型的架构来告诉 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) });

【讨论】:

  • 在 OP 的情况下,架构中的 _id 必须是字符串,因为他的文档中的 _id 值是字符串,而不是 ObjectId。此外,您不需要像 Mongoose 那样将 _id 值转换为 ObjectIds。
猜你喜欢
  • 1970-01-01
  • 2019-03-10
  • 2014-07-30
  • 2019-04-25
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2017-01-17
  • 2017-05-28
相关资源
最近更新 更多