NodeJS + MongoDB: получение данных из коллекции с помощью findOne ()

У меня есть коллекция "компаний" с несколькими предметами. Каждый объект имеет & quot; _id & quot; параметр. Я пытаюсь получить этот параметр из базы данных:

app.get('/companies/:id',function(req,res){
db.collection("companies",function(err,collection){
    console.log(req.params.id);
    collection.findOne({_id: req.params.id},function(err, doc) {
        if (doc){
            console.log(doc._id);
        } else {
            console.log('no data for this company');
        }
    });
});
});

Поэтому я запрашиваю companies / 4fcfd7f246e1464d05000001 (4fcfd7f246e1464d05000001 - это _id-parma нужного мне объекта) и findOne ничего не возвращает, что & apos; почему console.log («нет данных для этой компании»); выполняет.

Я абсолютно уверен, что у меня есть объект с _id = & quot; 4fcfd7f246e1464d05000001 & quot ;. Что я делаю не так? Спасибо!

However, I've just noticed that id is not a typical string field. That's what mViewer shows:

"_id": {
        "$oid": "4fcfd7f246e1464d05000001"
    },

Кажется немного странным ...

 Sergio Tulentsev07 июн. 2012 г., 12:00
Это ObjectId. В вашем запросе вы должны сконструировать один из строки (я удивлен, что библиотека не делает это за вас).

Ответы на вопрос(3)

Это потому, что_id поле в Монго неstring тип (как вашreq.params.id). Как предлагается в других ответах, вы должны явно преобразовать его.

ПытатьсяmongoskinВы можете использовать его как драйвер узла-mongodb, но с небольшим количеством сахара. Например:

// connect easier
var db = require('mongoskin').mongo.db('localhost:27017/testdb?auto_reconnect');

// collections
var companies = db.collection('companies');

// create object IDs
var oid = db.companies.id(req.params.id);

// some nice functions…
companies.findById();

//… and bindings
db.bind('companies', {
  top10: function(callback) {
    this.find({}, {limit: 10, sort: [['rating', -1]]).toArray(callback);
  } 
});

db.companies.top10(printTop10);

Ты можешь использоватьfindById() который позаботится о преобразовании идентификатора для вас.

company = Company.findById(req.params.id, function(err, company) {
    //////////
});
 29 сент. 2015 г., 17:44
Что такое компания в этом случае? Что такое findById? Можете ли вы дать ссылку на документацию? Спасибо!
Решение Вопроса

Вам необходимо создать ObjectID, а не передавать его в виде строки. Примерно так должно работать:

var BSON = require('mongodb').BSONPure;
var obj_id = BSON.ObjectID.createFromHexString("4fcfd7f246e1464d05000001");

Затем попробуйте использовать это в вашем find / findOne.

Изменить: как указаноOhad в комментариях (спасибо Ohad!), вы также можете использовать:

new require('mongodb').ObjectID(req.params.id)

ВместоcreateFromHexString как указано выше.

 24 окт. 2012 г., 15:35
Вы можете использовать «new require (» mongodb »). ObjectID (req.params.id) & quot; вместо createFromHexString
 03 июл. 2013 г., 11:29
@OhadKravchick работает как шарм. Я также проголосовал бы, если бы это был ответ
 f1nn07 июн. 2012 г., 12:15
Я пробовал var obj_id = BSON.ObjectID.createFromHexString (req.params.id); collection.findOne ({_ id: obj_id}, function (err, doc) {И это сработало - большое спасибо!

Ваш ответ на вопрос