2012-09-25 5 views
4

J'ai ce schéma Mongoose.MongooseJS utilisant find pour trouver par référence

var mongoose = require ('mongoose') 
    , dev  = require ('../db').dev(); 

var schema = new mongoose.Schema ({ 
    date: { 
    type: Date, 
    default: Date.now 
    }, 
    company: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Company' 
    }, 
    questionnaire: { 
    type: mongoose.Schema.Types.ObjectId, 
    ref: 'Questionnaire' 
    } 
}); 

module.exports = dev.model ('Survey', schema); 

Je ne souhaite trouver que les sondages ayant un identifiant d'entreprise spécifique. Comment je fais ça? J'ai essayé (avec mon gestionnaire Express):

app.get ('/survey', function (req, res) { 
    Survey.find ({ company: req.query.company }).populate ('questionnaire').exec (function (err, surveys) { 
    return res.json (surveys); 
    }); 
}); 
+0

En supposant que 'req.query.company' est une chaîne ObjectId, cela semble correct. Qu'est-ce qui ne fonctionne pas? – JohnnyHK

+0

C'est l'objectId correct. La recherche renvoie un tableau vide lorsque vous essayez d'utiliser la condition de l'entreprise. Mais sans conditions, renvoie la collection entière. Y compris le document avec l'id de l'entreprise que je cherchais en premier lieu. –

+0

Quelque chose ne va pas comme il semble. Est-il possible que la propriété 'company' dans le document que vous recherchez soit en fait une chaîne et non un ObjectId dans la base de données? – JohnnyHK

Répondre

6

Dans votre dernier commentaire vous dites que le champ company de la collection Surveys est en fait une chaîne et non et ObjectId et C'est pourquoi cela ne fonctionne pas. Parce que votre définition de schéma déclare company en tant qu'objet ObjectId, Mongoose convertira votre valeur req.query.company en un ObjectId, puis recherchera des documents dans Surveys où leur propriété company est un ObjectId avec la même valeur. Donc, si company est une chaîne dans la base de données, elle ne correspondra pas.

Si vous mettez à jour les valeurs company dans Surveys pour être ObjectIds au lieu de chaînes alors cela fonctionnera.

+0

Merci. Travaillé. J'étais juste déconcerté que le peuplement fonctionne de toute façon. –

0

Avez-vous essayé 'company._id

app.get ('/survey', function (req, res) { 
    Survey.find ({ 'company._id': req.query.company }).populate ('questionnaire').exec (function (err, surveys) { 
    return res.json (surveys); 
    }); 
}); 
+0

Je n'ai pas non, mais je l'ai fait maintenant et cela n'a pas fonctionné, j'ai aimé l'idée cependant, j'ai aussi essayé 'company.ref' etc, mais ce ne sont que les champs de l'objet qui spécifient le type dans le base de données, pas la valeur réelle. Quand je regarde les données dans la CLI mongo, il semble que ce soit une chaîne. –

Questions connexes