我有一个流星应用程序保存到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"'
。我试着用一切可能的方法来查询我的文件而没有运气。有什么想法吗?
答案 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) });