2012-06-07 16 views
16

Ho una raccolta "aziende" con diversi oggetti. Ogni oggetto ha il parametro "_id". Sto cercando di ottenere questo parametro dal db:NodeJS + MongoDB: raccolta dati dalla raccolta con findOne()

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'); 
     } 
    }); 
}); 
}); 

Quindi, chiedo aziende/4fcfd7f246e1464d05000001 (4fcfd7f246e1464d05000001 è _id-Parma di un oggetto che ho bisogno) e findOne restituisce nulla, cioe 'il motivo per cui console.log (' nessun dato per questa azienda '); esegue.

Sono assolutamente sicuro di avere un oggetto con _id = "4fcfd7f246e1464d05000001". Cosa sto facendo di sbagliato? Grazie!

Tuttavia, ho appena notato che id non è un campo di stringa tipico. Questo è quello che mostra mViewer:

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

sembra essere un po 'strano ...

+0

Questo è un oggetto. Nella tua query dovresti costruirne uno dalla stringa (sono sorpreso che la libreria non lo faccia per te). –

risposta

19

È necessario costruire l'ObjectID e non passarlo in forma di stringa. Qualcosa di simile dovrebbe funzionare:

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

Quindi, provare a utilizzarlo nel find/findOne.

Edit: Come sottolineato da Ohad nei commenti (grazie Ohad!), È anche possibile utilizzare:

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

Invece di createFromHexString come descritto sopra.

+0

Ho provato \t \t var obj_id = BSON.ObjectID.createFromHexString (req.params.id); \t \t collection.findOne ({_ id: obj_id}, function (err, doc) {E ha funzionato - grazie mille! – f1nn

+4

Puoi usare "new require ('mongodb'). ObjectID (req.params.id) "invece di createFromHexString –

+0

@OhadKravchick funziona come un incantesimo. Vorrei anche votare se era una risposta – Pith

3

Questo perché il campo _id in mongo non è del tipo string (come il tuo req.params.id). Come suggerito in altre risposte, dovresti convertirlo esplicitamente.

Prova mongoskin, potresti usarlo come driver nativo di mongodb-nodo, ma con un po 'di zucchero. Per esempio:

// 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); 
1

È possibile utilizzare findById() che si occuperà della conversione id per voi.

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

Cos'è l'azienda in questo caso? Che cos'è findById? Puoi collegarti alla documentazione? Grazie! – ryanm

Problemi correlati