NodeJS + MongoDB:使用findOne()从集合中获取数据
我有一个收集“公司”与几个对象。 每个对象都有“_id”参数。 我试图从数据库中获取这个参数:
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不是一个典型的string字段。 这就是mViewer显示的内容:
"_id": { "$oid": "4fcfd7f246e1464d05000001" },
似乎有点奇怪…
您需要构造ObjectID,而不是以stringforms传递它。 像这样的东西应该工作:
var BSON = require('mongodb').BSONPure; var obj_id = BSON.ObjectID.createFromHexString("4fcfd7f246e1464d05000001");
然后,尝试在你的find / findOne中使用它。
编辑:正如Ohad在评论中指出的(感谢Ohad!),你也可以使用:
new require('mongodb').ObjectID(req.params.id)
如上所述,而不是createFromHexString
。
这是因为mongo中的_id
字段不是string
types(如您的req.params.id
)。 正如其他答案中所build议的,您应该明确地转换它。
尝试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()
来处理你的id转换。
company = Company.findById(req.params.id, function(err, company) { ////////// });
- 如何与Node.js和Expressasynchronous加载和显示网页内容?
- 在express js的不同文件中访问db连接的同一个实例
- 护照JWT req.user在我的一个路由中是未定义的
- 将原始Markdown文本传递给Jade
- 我使用auth0进行用户身份validation,并且我有一个针对CRUDpost(title,img,desc)的API。 如何进行CRUD API的authentication调用?
- 从nodejs craddle中的couchdb中select?
- 在ExpressJS上使用mongoose运行“node_acl”
- Passport.js执行
- 在铁路快速子域处理程序告诉我子域参数(在路线)是控制器为什么?