node.js mongodb เลือกเอกสารโดย _id node-mongodb-native


93

ฉันกำลังพยายามเลือกเอกสารตามรหัส

ฉันได้ลองแล้ว:

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

collection.update({ "_id": theidID }

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

ยังพยายาม:

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

สิ่งนี้ทำให้ฉันมีข้อผิดพลาด 500 ...

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

collection.update({ _id: o_id }

ไม่มีงานเหล่านี้ วิธีการเลือกโดย _id?


1
collection.find({"_id": ObjectId(theidID)})ควรทำงาน.
Bernie Hackett

@ Bugai13 ฉันยอมแพ้และลงเอยด้วยการกำหนด ID ที่กำหนดเองสำหรับทุกเอกสาร
มาร์ค

ฉันต้องการสิ่งนี้สำหรับการเลือก / ค้นหา (ไม่ใช่การอัปเดตแม้กระทั่ง) โชคดีไหม?
strager

จะใช้ไม่ได้หากคุณไม่มีการอ้างอิงถึงตัวต่ออนุกรมที่ถูกต้อง
MK_Dev

@BernieHackett วิธีนี้ใช้ไม่ได้กับโหนดรันไทม์ 12.13 กับ mongodb เวอร์ชัน 3.4 มันให้ข้อผิดพลาดที่อธิบายไว้ที่นี่stackoverflow.com/questions/26453507/…
Kusal Hettiarachchi

คำตอบ:


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

1
ปี 2559 - ยังใช้งานได้ดี หากคุณไม่มี maby native_parser:false- ตรวจสอบคำตอบของ Raphael ด้านล่าง
fider

2
นี้ได้ผล ให้แน่ใจว่าคุณจะโทรObjectID()ในrequire('mongodb')และไม่ได้อยู่require('mongodb').MongoClient
อเล็กซ์โอ

ด้วยวิธีนี้ฉันได้รับmongoClient.ObjectID is not a constructorข้อผิดพลาด
Sachin Shah

หลังจากลอง 2 ชั่วโมงในที่สุดฉันก็ตอบพร้อมกับคุณขอบคุณมาก
พระอิศวร

73

นี่คือแนวทางที่ใช้ได้ผลสำหรับฉัน

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

20

ตอนนี้คุณสามารถใช้สิ่งนี้:

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

คุณสามารถดูเอกสารได้ที่นี่


12

ด้วยnative_parser:false:

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

ด้วยnative_parser:true:

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

8

ฉันเพิ่งใช้รหัสนี้ในแอป Node.js ในไฟล์คอนโทรลเลอร์และใช้งานได้:

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

อย่าลืมติดตั้ง "mongodb" ก่อนและหากคุณใช้การเข้ารหัสรหัสผ่านของคุณด้วย bcrypt ด้วย "presave" ตรวจสอบให้แน่ใจว่าคุณจะไม่เข้ารหัสรหัสผ่านหลังจากการแก้ไขระเบียนใน DB แต่ละครั้ง


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

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

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

1

คำตอบขึ้นอยู่กับประเภทตัวแปรที่คุณส่งผ่านเป็นรหัส ฉันดึงรหัสอ็อบเจ็กต์โดยทำการสืบค้นและจัดเก็บ account_id ของฉันเป็นแอตทริบิวต์. ใช้วิธีนี้คุณเพียงแค่ค้นหาโดยใช้ mongo id

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

นี่คือสิ่งที่ได้ผลสำหรับฉัน ใช้ mongoDB

const mongoDB = require('mongodb')

จากนั้นที่ด้านล่างที่ฉันกำลังโทรออกด่วน

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

 });`


0

ฉันใช้"mongodb": "^3.6.2"เวอร์ชันไคลเอนต์และเซิร์ฟเวอร์4.4.1

// where 1 is your document id
const document = await db.collection(collection).findOne({ _id: '1' })
console.log(document)

หากคุณต้องการคัดลอกและวางนี่คือสิ่งที่คุณต้องการ

const { MongoClient } = require('mongodb')
const uri = '...'
const mongoDb = '...'
const options = {}
;(async () => {
  const client = new MongoClient(uri, options)
  await client.connect()
  const db = client.db(mongoDb)
  const document = await db.collection(collection).findOne({ _id: '1' })
  console.log(document)
)}()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.