2013-07-11 5 views
1

J'ai une application de météore sauver des choses à mongodb et j'ai une API que je souhaite faire et exposer via REST.Mongoosejs ne peut pas interroger avec 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 

Le problème est que je ne peux pas interroger les id que je vois dans ma base de données. Par exemple, j'ai cet utilisateur:

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

Si je vais à /accounts/meta/zcdsHuKr5dTh3xHz5 il dit 'Cast to ObjectId failed for value "zcdsHuKr5dTh3xHz5" at path "_id"'. J'ai essayé de toutes les manières possibles de demander mon document sans chance. Des idées?

+0

Les identifiants de vos documents sont-ils un ObjectId? –

+0

C'est juste la chaîne que j'ai prise de la base de données elle-même. Ne pense pas que c'est un identifiant d'objet. Je suis encore nouveau avec mongo. –

Répondre

2

le problème est que vous devez définir un schéma pour votre modèle pour dire que votre champ Mongoose _id est un String au lieu de l'ObjectId standard cette collection:

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

Merci monsieur. Je suis allé avec le moine étant donné les faibles besoins de mon application, mais c'est la bonne réponse. –

1

Votre champ _id semble ne pas être un objet ObjectId. La méthode findById sur Mongoose attend:

objectID, ou une valeur qui peut être casté à un

Ainsi, si votre _id est en fait pas un ObjectId, vous devez requête à l'aide findOne méthode

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

Cela échoue avec la même erreur. '{Message: 'Cast à ObjectId a échoué pour la valeur "zcdsHuKr5dTh3xHz5" au chemin "_id"', nom : 'CastError', tapez : 'ObjectId', valeur : 'zcdsHuKr5dTh3xHz5', chemin : '_id'}' –

+0

comment est défini votre schéma de compte? –

+0

Il est de base 'Account = mongoose.model ('accounts');' –

1

La réponse actuellement propagée n'est pas une bonne idée. Ne modifiez pas le schéma de votre modèle pour indiquer à Mongoose que votre champ _id est une chaîne. C'est une mauvaise idée en termes de validation et devrait être considérée comme un hack.

Essayez ceci: Si vous souhaitez interroger un _id à mangouste, vous devez lancer le _id à ObjectId

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

Mongoosejs vous oblige à jeter l'identifiant dans la requête aussi bien (je n ne trouve rien à ce sujet dans la documentation de mongoose non plus):

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

Dans le cas de l'OP, le '_id' dans le schéma doit être une chaîne car les valeurs' _id' dans ses documents sont des chaînes, pas des ObjectIds. De plus, vous n'avez pas besoin de lancer les valeurs '_id' pour ObjectIds comme vous le montrez, car Mongoose le fait pour vous. – JohnnyHK

Questions connexes