我正在传递查询参数,猫鼬查询可以使用sort
,limit
或skip
的任意组合。
我想到的是根据已传递的参数创建多只猫鼬查询。因此,如果仅传递sort
,则结果查询将具有Document.find({}).sort({})
,并且如果仅传递limit
,则查询将是Document.find({}).limit({})
我应该这样写吗?
router.get('/', (req, res) => {
if(req.query.sortByPrice) {
Property.find({})
.sort({ price: req.query.sortByPrice === 'asc' ? 1 : -1 })
.populate('user_id', 'name')
.exec((err, properties) => {
if (err)
return res
.status(404)
.json({ error: "Can't get user details!" });
res.status(200).json(properties);
});
}
if(req.query.limit) {
Property.find({})
.limit(req.query.limit)
.populate('user_id', 'name')
.exec((err, properties) => {
if (err)
return res
.status(404)
.json({ error: "Can't get user details!" });
res.status(200).json(properties);
});
}
});
答案 0 :(得分:1)
您可以从请求正文中创建变量options
并将其作为第三个参数传递给.find()
查询,而无需使用if-else
块编写冗余代码。
.find()
查询的第二个参数是projection
,因此请不要忘记在此处传递一个空对象。
尝试一下:
let options={};
if(req.params.sortByPrice){
options.sort = {
price: req.params.sortByPrice === 'asc' ? 1 : -1
}
}
if(req.params.limit){
options.limit = req.parms.limit
}
Property.find({},{},options)
.populate('user_id', 'name')
.exec((err, properties) => {
if (err)
return res
.status(404)
.json({ error: "Can't get user details!" });
res.status(200).json(properties);
return;
});
注意:不要忘记在res.status().json()
之后返回,否则可能会收到错误cant set headers after they are sent
。如果您尝试再次发送响应。