node.js mongodb通过_id选择文档node-mongodb-native


91

我正在尝试通过ID选择文档

我试过了:

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)})应该管用。
伯尼·哈克特

@ Bugai13我放弃了,最终为每个文档分配了一个自定义ID。
标记

我需要这个来进行选择/查找(甚至没有更新)。运气好的话?
斯特拉格2011年

如果您没有引用正确的序列化程序,它将无法正常工作。
MK_Dev 2012年

@BernieHackett此方法不适用于mongodb 3.4版的节点运行时12.13。它给这里描述的错误stackoverflow.com/questions/26453507/...
Kusal Hettiarachchi

Answers:


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

1
2016年-仍然可以正常运行。如果您没有native_parser:false
黑猩猩,

2
这有效。确保您呼叫ObjectID()require('mongodb'),而不是require('mongodb').MongoClient
亚历克Ø

这样我就mongoClient.ObjectID is not a constructor出错了。
萨钦沙(Shachin 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);
    });
  });
}

19

现在您可以使用:

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

7

我只是在控制器文件中的Node.js应用中使用了此代码,它的工作原理是:

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

不要忘记之前安装“ mongodb”,并且如果您使用带有“ presave”的bcrypt加密密码,请确保在数据库中的记录每次修改后都不会加密密码。


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

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

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

1

答案取决于您作为id传入的变量类型。我通过执行查询并将我的account_id存储为._id属性来拉出对象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));

 });`

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.