NodeJS + MongoDB: получение данных из коллекции с помощью findOne() - программирование
Подтвердить что ты не робот

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

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

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

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

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

Однако я только что заметил, что идентификатор не является типичным строковым полем. Это показывает mViewer:

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

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

4b9b3361

Ответ 1

Вам нужно построить 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, как указано выше.

Ответ 2

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

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

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

Ответ 3

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

company = Company.findById(req.params.id, function(err, company) {
    //////////
});