我设置了一个mongoose查询,我想找到特定的记录,在自定义queryObject中提到。这个queryObject包含键值对(如果存在的话)。因此,如果res.query不包含例如limit,它不会被添加到queryObject。
无论出于何种原因,queryObject.limit参数都会导致一个空数组。不过,当输入一个赋值了数字的变量时,它确实会进行过滤。
这不起作用:
const showOneMovie = async(req,res)=>{
try {
const {title, publishDate, genre, skip, sort} = req.query;
const queryObject = {};
if(title){
queryObject.title = title;
}
if(publishDate){
queryObject.publishDate = publishDate;
}
if(sort){
sort === "Ascending" ? queryObject.sort = "-title" : queryObject.sort = "title";
}
queryObject.limit = 2;
let data = await Movie.find(queryObject).limit(queryObject.limit);
res.status(200).json(data);
} catch (error) {
console.log(error)
}
}
这一方法:
const showOneMovie = async(req,res)=>{
try {
const {title, publishDate, genre, skip, sort} = req.query;
const queryObject = {};
if(title){
queryObject.title = title;
}
if(publishDate){
queryObject.publishDate = publishDate;
}
if(sort){
sort === "Ascending" ? queryObject.sort = "-title" : queryObject.sort = "title";
}
const limit = 2;
let data = await Movie.find(queryObject).limit(limit);
res.status(200).json(data);
} catch (error) {
console.log(error)
}
}
我知道我可以跳过这个问题,但我真的很想了解这种行为。
1条答案
按热度按时间yqhsw0fo1#
这个答案的功劳应该归于@GrafiCode,但由于只有1个错误的答案被张贴,我们需要一个正确的答案。
在第一个示例中,您为
queryObject
分配了一个键名limit
,并将其值设置为2:当你把
queryObject
传递给find函数时:Mongoose期望你的文档具有
title
、publishDate
和limit
的属性,因为这是你添加到queryObject
中的内容,所以它认为这就是你要找的内容(现在忽略排序)。您的queryObject
可能看起来像这样:Mongoose 接下来执行的是:
由于您的Schema不包含
limit
属性,mongoose不会找到任何内容。在第二个示例中,您没有将
limit
添加到queryObject
,而是创建了一个词法作用域变量const limit = 2;
,该变量在用于限制结果之前不是查询的一部分。