mongoose 当使用查询对象作为参数时,为什么.limit()结果为空数组?

3pvhb19x  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(122)

我设置了一个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)
    }
}

我知道我可以跳过这个问题,但我真的很想了解这种行为。

yqhsw0fo

yqhsw0fo1#

这个答案的功劳应该归于@GrafiCode,但由于只有1个错误的答案被张贴,我们需要一个正确的答案。
在第一个示例中,您为queryObject分配了一个键名limit,并将其值设置为2:

queryObject.limit = 2;

当你把queryObject传递给find函数时:

let data = await Movie.find(queryObject).limit(queryObject.limit);

Mongoose期望你的文档具有titlepublishDatelimit的属性,因为这是你添加到queryObject中的内容,所以它认为这就是你要找的内容(现在忽略排序)。您的queryObject可能看起来像这样:

{ 
   title: 'RoboCop',
   publishDate: 1987,
   limit: 10,
}

Mongoose 接下来执行的是:

let data = await Movie.find({ 
   title: 'RoboCop',
   publishDate: 1987,
   limit: 10,
}).limit(queryObject.limit);

由于您的Schema不包含limit属性,mongoose不会找到任何内容。
在第二个示例中,您没有将limit添加到queryObject,而是创建了一个词法作用域变量const limit = 2;,该变量在用于限制结果之前不是查询的一部分。

相关问题