我有一个包含多个对象的“公司”集合。每个对象都有“_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”的对象。我做错了什么?谢谢!
但是,我刚刚注意到id不是典型的字符串字段。这就是mViewer所展示的:
"_id": {
"$oid": "4fcfd7f246e1464d05000001"
},
似乎有点奇怪......
答案 0 :(得分:20)
您需要构造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
。
答案 1 :(得分:3)
这是因为mongo中的_id
字段不属于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);
答案 2 :(得分:1)
您可以使用findById()
来处理身份转换。
company = Company.findById(req.params.id, function(err, company) {
//////////
});
答案 3 :(得分: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" })
}