2012-06-07 24 views
16

Tôi có một bộ sưu tập "công ty" với một số đối tượng. Mỗi đối tượng có tham số "_id". Tôi đang cố gắng để có được thông số này từ db:NodeJS + MongoDB: Lấy dữ liệu từ bộ sưu tập với findOne()

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

Vì vậy, tôi yêu cầu các công ty/4fcfd7f246e1464d05000001 (4fcfd7f246e1464d05000001 là _id-parma của một đối tượng tôi cần) và findOne trả gì cả, đó là lý do tại sao console.log (' không có dữ liệu cho công ty này '); thực hiện.

Tôi hoàn toàn chắc chắn rằng tôi có một đối tượng với _id = "4fcfd7f246e1464d05000001". Tôi đang làm gì sai? Cảm ơn!

Tuy nhiên, tôi vừa nhận thấy rằng id không phải là trường chuỗi điển hình. Đó là những gì mViewer cho thấy:

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

Có vẻ là lạ một chút ...

+0

Đó là một ObjectId. Trong truy vấn của bạn, bạn nên xây dựng một từ chuỗi (Tôi ngạc nhiên rằng thư viện không làm điều đó cho bạn). –

Trả lời

19

Bạn cần phải xây dựng các ObjectId và không vượt qua nó như một chuỗi. Một cái gì đó như thế này sẽ hoạt động:

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

Sau đó, hãy thử sử dụng tính năng đó trong find/findOne của bạn.

Edit: Như đã chỉ ra bởi Ohad trong các ý kiến ​​(nhờ Ohad!), Bạn cũng có thể sử dụng:

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

Thay vì createFromHexString như đã nêu ở trên.

+0

Tôi đã thử \t \t var obj_id = BSON.ObjectID.createFromHexString (req.params.id); \t \t collection.findOne ({_ id: obj_id}, hàm (err, doc) {Và nó hoạt động - cảm ơn bạn rất nhiều! – f1nn

+4

Bạn có thể sử dụng "yêu cầu mới ('mongodb'). ObjectID (req.params.id) "thay vì createFromHexString –

+0

@OhadKravchick hoạt động như một sự quyến rũ. Tôi cũng sẽ bình chọn nếu đó là câu trả lời – Pith

3

Đó là vì _id trường ở mongo không phải là string loại (làm req.params.id) của bạn. Như được đề xuất trong các câu trả lời khác, bạn nên chuyển đổi nó một cách rõ ràng.

Hãy thử mongoskin, bạn có thể sử dụng nó như trình điều khiển gốc-mongod-nút, nhưng với một số đường. Ví dụ:

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

Bạn có thể sử dụng findById() sẽ quản lý việc chuyển đổi id cho bạn.

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

Công ty là gì trong trường hợp này? findById là gì? Bạn có thể liên kết đến tài liệu này không? Cảm ơn! – ryanm

Các vấn đề liên quan