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?


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

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

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


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

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.


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

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

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

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

});


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

 });`

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.