16

いくつかのオブジェクトを含むコレクション「会社」があります。すべてのオブジェクトには「_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');
        }
    });
});
});

したがって、companys / 4fcfd7f246e1464d05000001(4fcfd7f246e1464d05000001は必要なオブジェクトの_id-parmaです)を要求すると、findOneは何も返しません。そのため、console.log('この会社のデータはありません'); 実行します。

_id="4fcfd7f246e1464d05000001"のオブジェクトがあると確信しています。私が間違っているのは何ですか?ありがとう!

ただし、idが一般的な文字列フィールドではないことに気づきました。それがmViewerが示すものです。

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

少し変なようです...

4

4 に答える 4

21

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上で概説したようにではなく。

于 2012-06-07T10:06:27.393 に答える
3

これ_idは、mongoのフィールドがstring(yourのようにreq.params.id)タイプではないためです。他の回答で示唆されているように、明示的に変換する必要があります。

mongoskinを試してみてください。node -mongodb-nativedriverのように使用できますが、砂糖が含まれています。例えば:

// 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);
于 2012-06-07T10:25:06.490 に答える
1

findById()ID変換の面倒を見ることができます。

company = Company.findById(req.params.id, function(err, company) {
    //////////
});
于 2013-09-03T11:01:31.727 に答える
0

これらがうまくいかなかった場合、これはブログ投稿にアクセスするために私のために働きました:

const getSinglePost = async (req, res) => {

    let id = req.params.id;
    var ObjectId = require('mongodb').ObjectId;
    const db = await client.db('CMS');

    const data = await db.collection("posts").findOne({ _id: ObjectId(id) })

    if (data) {
        res.status(200).send(data)
    } else res.status(400).send({ message: "no post found" })

}
于 2020-05-22T19:04:01.540 に答える