web-dev-qa-db-fra.com

node.js mongodb sélectionne le document par _id node-mongodb-native

J'essaie de sélectionner un document par identifiant

J'ai essayé:

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

collection.update({ "_id": theidID }

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

Aussi essayé:

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

Cela me donne une erreur 500 ...

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

collection.update({ _id: o_id }

Aucun de ces travaux. Comment sélectionner par _id?

80
Mark
var mongo = require('mongodb');
var o_id = new mongo.ObjectID(theidID);
collection.update({'_id': o_id});
125
KingPin

C'est l'approche qui a fonctionné pour moi.

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);
    });
  });
}
68
ncoronges

maintenant vous pouvez simplement utiliser ceci:

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

Vous pouvez voir la documentation ici

18
nktssh

Avec native_parser:false:

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

Avec native_parser:true:

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

Je viens d'utiliser ce code dans l'application Node.js dans le fichier du contrôleur, et cela fonctionne:

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

n'oubliez pas d'installer "mongodb" auparavant, et si vous utilisez le cryptage de vos mots de passe avec bcrypt avec "presave", assurez-vous de ne pas chiffrer le mot de passe après chaque modification de l'enregistrement dans la base de données.

7
Yarik

C'est ce qui a fonctionné pour moi. Utiliser mongoDB

const mongoDB = require('mongodb')

Puis en bas, je fais mon appel express.

router.get('/users/:id', (req, res) => {
const id = req.params.id;
var o_id = new mongoDB.ObjectID(id);

const usersCollection = database.collection('users');

usersCollection.findOne({
  _id: o_id
})

.then(userFound => {
  if (!userFound){
    return res.status(404).end();
  }
  // console.log(json(userFound));
  return res.status(200).json(userFound)
})
.catch(err => console.log(err));

 });`
1
Roger Perez

La réponse dépend du type de variable que vous transmettez en tant qu'id. J'ai extrait un identifiant d'objet en effectuant une requête et en stockant mon identifiant de compte sous l'attribut ._id. En utilisant cette méthode, vous interrogez simplement en utilisant l'identifiant 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();    
        } 
      }
    )  
  } 
})

});

1
jmontross