我正在尝试使用_id
在MongoDB中查询单个文档。我使用的是Mongoose(版本:4.11.1)。当我尝试运行查询时,我将_id
作为路由localhost:3000/poi/one/595ef9c8c4891179f8b4bbfb
上的URL参数传递。
当我按Enter键时,浏览器将继续加载并永远不会完成。我能够在控制台中看到“获得一个POI”。但从来没有看到任何其他东西。
我正在使用mLab来托管我的数据库。里面只有一个文件。
mLab文件:
jsperf.com
以下是我的查询代码:
let express = require('express');
let router = express.Router();
let {Poi} = require('../models/db-model');
router.get('/one/:id', (req, res, next) => {
console.log('getting one POI');
Poi.findOne({_id: req.params.id}).exec(function (err, poi) {
if (err) {
res.send('error occurred')
}
else {
console.log(poi);
res.send(poi)
}
});
});
我的数据库模型:
const mongoose = require('mongoose');
// point of interest schema
let poiSchema = mongoose.Schema({
name: {
type: String,
required: true,
minlength: 1,
trim: true,
},
url: {
type: String,
required: true
},
address: {
type: String,
required: true
},
cost: {
type: Number,
required: false
}
});
// instantiate models
let Poi = mongoose.model('Poi', poiSchema);
// export models
module.exports = {Poi};
我已经坚持这个问题好几个小时了,可能无法弄清问题是什么。
修改
Mongoose配置:
const mongoose = require('mongoose');
const config = require('../app-config.json');
mongoose.Promise = global.Promise;
// connect to mLab Collection
mongoose.connect(config.dbUri);
module.exports = {mongoose};
答案 0 :(得分:0)
在findOne
的官方文档中,Mongoose建议在Model.findById()
字段查询时使用_id
方法。您可以在此处专门阅读findById
的文档:http://mongoosejs.com/docs/api.html#model_Model.findById
基本上它看起来像是:
Poi.findById(req.params.id).exec(function (err, poi) {
// ...
答案 1 :(得分:0)
你的问题的答案非常简单。
虽然req.params.id
是String
,但它不等于mongo生成的ID。并且为了按ID进行查询,您必须将String
转换为ObjectId
,这可以通过多种方式完成。
如果你的模块中需要mongoose
,你可以通过执行以下操作将字符串转换为对象id:mongoose.Types.ObjectId(req.params.id)
然后你将你的id作为Object而不是字符串,你可以查询成功。