2011-02-04 26 views
59

Estoy intentando seleccionar un documento de identificaciónNode.js mongodb seleccionar documento _id nodo-mongodb nativo

He intentado:

collection.update({ "_id": { "$oid": + theidID } } 

collection.update({ "_id": theidID } 

collection.update({ "_id.$oid": theidID }} 

También probamos:

collection.update({ _id: new ObjectID(theidID) } 

Esto me da un error 500 ...

var mongo = require('mongodb') 
var BSON = mongo.BSONPure; 
var o_id = new BSON.ObjectID(theidID); 

collection.update({ _id: o_id } 

Ninguno de estos trabajos. ¿Cómo seleccionar por _id?

+0

¿Lo hiciste funcionar? –

+0

@ Bugai13 Me rendí y terminé asignando una identificación personalizada para cada documento. – Mark

+0

Necesito esto para seleccionar/encontrar (no una actualización, incluso). ¿Alguna suerte? – strager

Respuesta

86
var mongo = require('mongodb'); 
var o_id = new mongo.ObjectID(theidID); 
collection.update({'_id': o_id}); 
+4

Actualización: esto no funciona más, consulte la respuesta de ncoronges. O para una versión más simple, la respuesta de Nikita – Jaydeep

+2

Jaydeep rights. Actualizado ... – KingPin

+0

Año 2016 - todavía funciona bien. Si no tiene maby, tiene 'native_parser: false' - verifique la respuesta de Rafael debajo de – fider

11

Con native_parser:false:

var BSON = require('mongodb').BSONPure; 
var o_id = BSON.ObjectID.createFromHexString(theidID); 

Con native_parser:true:

var BSON = require('mongodb').BSONNative; 
var o_id = BSON.ObjectID.createFromHexString(theidID); 
58

Este enfoque que trabajó para mí.

var ObjectId = require('mongodb').ObjectID; 

var get_by_id = function(id, callback) { 
    console.log("find by: "+ id); 
    get_collection(function(collection) { 
    collection.findOne({"_id": new ObjectId(id)}, function(err, doc) { 
     callback(doc); 
    }); 
    }); 
} 
+0

Esto funciona ahora porque la respuesta anterior ya no. ... – vcazan

0

La respuesta depende del tipo de variable que está ingresando como id. Saqué una identificación de objeto haciendo una consulta y almacenando mi account_id como el atributo ._id. Usando este método, simplemente consultas utilizando la id de mongo.

// begin account-manager.js 
var MongoDB = require('mongodb').Db; 
var dbPort  = 27017; 
var dbHost  = '127.0.0.1'; 
var dbName  = 'sample_db'; 
db = new MongoDB(dbName, new Server(dbHost, dbPort, {auto_reconnect: true}), {w: 1}); 
var accounts = db.collection('accounts'); 

exports.getAccountById = function(id, callback) 
{ 
    accounts.findOne({_id: id}, 
    function(e, res) { 
    if (e) { 
     callback(e) 
    } 
    else { 
     callback(null, res) 
    } 

    }); 
} 
// end account-manager.js 

// my test file 
var AM = require('../app/server/modules/account-manager'); 

it("should find an account by id", function(done) { 

AM.getAllRecords(function(error, allRecords){ 
    console.log(error,'error') 
    if(error === null) { 
    console.log(allRecords[0]._id) 
    // console.log('error is null',"record one id", allRecords[0]._id) 
    AM.getAccountById(   
     allRecords[0]._id, 
     function(e,response){ 
     console.log(response,"response") 
     if(response) { 
      console.log("testing " + allRecords[0].name + " is equal to " + response.name) 
      expect(response.name).toEqual(allRecords[0].name); 
      done();  
     } 
     } 
    ) 
    } 
}) 

});

13

ahora sólo puede utilizar esto:

var ObjectID = require('mongodb').ObjectID; 
var o_id = new ObjectID("yourObjectIdString"); 
.... 
collection.update({'_id': o_id}); 

Se puede ver la documentación here

0

simplemente he utilizado este código en Node.js aplicación en el archivo de controlador, y funciona:

var ObjectId = require('mongodb').ObjectId; 
... 
User.findOne({_id:ObjectId("5abf2eaa1068113f1e")}) 
.exec(function(err,data){ 
    // do stuff 
}) 

no se olvide de instalar "mongodb" antes, y si está utilizando el cifrado de sus contraseñas con bcrypt con "guardar", asegúrese de no cifrar la contraseña después de cada modificación del registro en DB.

Cuestiones relacionadas