node.js mongodb Wählen Sie das Dokument mit _id node-mongodb-native aus

91

Ich versuche, ein Dokument anhand seiner ID auszuwählen

Ich habe es versucht:

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

collection.update({ "_id": theidID }

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

Auch versucht:

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

Dies gibt mir einen Fehler 500 ...

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

collection.update({ _id: o_id }

Keine dieser Arbeiten. Wie wähle ich mit _id aus?

Kennzeichen
quelle
1
collection.find({"_id": ObjectId(theidID)})sollte arbeiten.
Bernie Hackett
@ Bugai13 Ich habe aufgegeben und jedem Dokument eine benutzerdefinierte ID zugewiesen.
Mark
Ich brauche dies für eine Auswahl / Suche (nicht einmal ein Update). Etwas Glück?
Strager
Es funktioniert nicht, wenn Sie keinen Verweis auf den richtigen Serializer haben.
MK_Dev
@BernieHackett Diese Methode funktioniert nicht für Node Runtime 12.13 mit Mongodb Version 3.4. Es gibt den hier beschriebenen Fehler stackoverflow.com/questions/26453507/…
Kusal Hettiarachchi

Antworten:

144
var mongo = require('mongodb');
var o_id = new mongo.ObjectID(theidID);
collection.update({'_id': o_id});
Königszapfen
quelle
1
Jahr 2016 - funktioniert immer noch in Ordnung. Wenn Sie kein Baby hatten native_parser:false- überprüfen Sie die Antwort von Raphael unten
fider
2
Das funktioniert. Stellen Sie sicher , die Sie anrufen , ObjectID()auf require('mongodb')und nicht aufrequire('mongodb').MongoClient
Alec O
Auf diese Weise habe ich mongoClient.ObjectID is not a constructorFehler bekommen.
Sachin Shah
Nach 2 Stunden versuchen, endlich habe ich es mit Ihrer Antwort genagelt, vielen Dank Mann.
Shiva
73

Dies ist der Ansatz, der für mich funktioniert hat.

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

Jetzt können Sie einfach Folgendes verwenden:

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

Die Dokumentation finden Sie hier

nktssh
quelle
12

Mit native_parser:false:

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

Mit native_parser:true:

var BSON = require('mongodb').BSONNative;
var o_id = BSON.ObjectID.createFromHexString(theidID);
Raphael Schweikert
quelle
7

Ich habe diesen Code gerade in der Node.js-App in der Controller-Datei verwendet und er funktioniert:

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

Vergessen Sie nicht, "mongodb" vorher zu installieren. Wenn Sie die Verschlüsselung Ihrer Passwörter mit bcrypt mit "presave" verwenden, stellen Sie sicher, dass Sie das Passwort nicht nach jeder Änderung des Datensatzes in DB verschlüsseln.

Yarik
quelle
2
/* get id */
const id        = request.params.id; // string "5d88733be8e32529c8b21f11"

/* set object id */
const ObjectId  = require('mongodb').ObjectID;

/* filter */
collection.update({ 
    "_id": ObjectId(id)
} )
Anteliebe
quelle
1

Die Antwort hängt von dem Variablentyp ab, den Sie als ID übergeben. Ich habe eine Objekt-ID abgerufen, indem ich eine Abfrage durchgeführt und meine account_id als ._id-Attribut gespeichert habe. Mit dieser Methode fragen Sie einfach mit der Mongo-ID ab.

// 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();    
        } 
      }
    )  
  } 
})

});

jmontross
quelle
1

Das hat bei mir funktioniert. MongoDB verwenden

const mongoDB = require('mongodb')

Dann unten, wo ich meinen Express mache, bekomme ich einen Anruf.

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

 });`
Roger Perez
quelle
0

Wenn Sie Mongosee verwenden, können Sie die Funktion vereinfachen

FindById:

diese ersetzen in mongodb: "_id" : ObjectId("xyadsdd434434343"),

example:

// find adventure by id and execute
Adventure.findById('xyadsdd434434343', function (err, adventure) {});

https://mongoosejs.com/docs/api.html#model_Model.findById

Diego Mauricio Guerrero
quelle