web-dev-qa-db-fra.com

NodeJS + MongoDB: Obtention des données de la collection avec findOne ()

J'ai une collection "entreprises" avec plusieurs objets. Chaque objet a le paramètre "_id". J'essaie d'obtenir ce paramètre de db:

app.get('/companies/:id',function(req,res){
db.collection("companies",function(err,collection){
    console.log(req.params.id);
    collection.findOne({_id: req.params.id},function(err, doc) {
        if (doc){
            console.log(doc._id);
        } else {
            console.log('no data for this company');
        }
    });
});
});

Je demande donc à companies/4fcfd7f246e1464d05000001 (4fcfd7f246e1464d05000001 est _id-parma d'un objet dont j'ai besoin) et findOne ne renvoie rien, pourquoi Console.log ('aucune donnée pour cette société'); exécute.

Je suis absolument sûr d'avoir un objet avec _id = "4fcfd7f246e1464d05000001". Qu'est-ce que je fais mal? Merci!

Cependant, je viens de remarquer que l'id n'est pas un champ de chaîne typique. C'est ce que montre mViewer:

"_id": {
        "$oid": "4fcfd7f246e1464d05000001"
    },

Semble être un peu étrange ...

16
f1nn

Vous devez construire l'ObjectID et ne pas le transmettre sous forme de chaîne. Quelque chose comme ça devrait marcher:

var BSON = require('mongodb').BSONPure;
var obj_id = BSON.ObjectID.createFromHexString("4fcfd7f246e1464d05000001");

Ensuite, essayez de l’utiliser dans find/findOne.

Edit: Comme indiqué par Ohad dans les commentaires (merci Ohad!), Vous pouvez également utiliser: 

new require('mongodb').ObjectID(req.params.id)

Au lieu de createFromHexString comme indiqué ci-dessus.

20
Adam Comerford

C'est parce que le champ _id dans Mongo n'est pas de type string (en tant que votre req.params.id). Comme suggéré dans d'autres réponses, vous devriez explicitement le convertir.

Essayez mongoskin , vous pourriez l’utiliser comme pilote node-mongodb-native, mais avec du sucre. Par exemple:

// connect easier
var db = require('mongoskin').mongo.db('localhost:27017/testdb?auto_reconnect');

// collections
var companies = db.collection('companies');

// create object IDs
var oid = db.companies.id(req.params.id);

// some Nice functions…
companies.findById();

//… and bindings
db.bind('companies', {
  top10: function(callback) {
    this.find({}, {limit: 10, sort: [['rating', -1]]).toArray(callback);
  } 
});

db.companies.top10(printTop10);
3
Alexey Zabrodsky

Vous pouvez utiliser findById() qui se chargera de la conversion d'identifiant.

company = Company.findById(req.params.id, function(err, company) {
    //////////
});
1
darren