2012-06-07 16 views
16

Tengo una colección de "empresas" con varios objetos. Cada objeto tiene el parámetro "_id". Estoy tratando de obtener este parámetro desde db:NodeJS + MongoDB: Obtener datos de la colección 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'); 
     } 
    }); 
}); 
}); 

Así que pidan a las empresas/4fcfd7f246e1464d05000001 (4fcfd7f246e1464d05000001 es _id-Parma de un objeto que necesito) y findOne no devuelve nada, que 'por qué console.log (' no hay datos para esta empresa '); ejecuta

Estoy absolutamente seguro de que tengo un objeto con _id = "4fcfd7f246e1464d05000001". ¿Qué estoy haciendo mal? ¡Gracias!

Sin embargo, acabo de notar que la identificación no es un campo de cadena típico. Eso es lo que muestra mViewer:

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

parece ser un poco extraño ...

+0

Eso es un Id. De objeto. En su consulta, debe construir uno a partir de la cadena (me sorprende que la biblioteca no lo haga por usted). –

Respuesta

19

Es necesario para construir el ID de objeto y no transmitirla en forma de cadena. Algo como esto debería funcionar:

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

Luego, intente usar eso en su find/findOne.

Editar: Como ha señalado Ohad en los comentarios (gracias Ohad!), También se puede utilizar:

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

En lugar de createFromHexString como se indicó anteriormente.

+0

Intenté \t \t var obj_id = BSON.ObjectID.createFromHexString (req.params.id); \t \t collection.findOne ({_ id: obj_id}, function (err, doc) {Y funcionó - ¡muchas gracias! – f1nn

+4

Puede usar "new require ('mongodb'). ObjectID (req.params.id) "en lugar de createFromHexString –

+0

@OhadKravchick funciona como un amuleto. También votaría si fuera una respuesta – Pith

3

Eso es porque el campo _id en mongo no es del tipo string (como su req.params.id). Como se sugiere en otras respuestas, debe convertirlo explícitamente.

Pruebe mongoskin, podría usarlo como el controlador node-mongodb-native, pero con algo de azúcar. Por ejemplo:

// 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

Puede utilizar findById() que se encargará de la conversión de Identificación para usted.

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

¿Qué es Company en este caso? ¿Qué es findById? ¿Puede vincular a la documentación? Gracias! – ryanm

Cuestiones relacionadas