我有一个mongo模式,看起来像这样:
const UserSchema = new mongoose.Schema({
profile: {
// ...other stuff
age: {
type: Number,
min: [18, "Min age is 18"],
max: [99, "Max age is 99"],
},
我试图通过 Postman 查询它与以下:/users?profile.age[lte]=100
其他查询也可以工作,例如users?profile.age=36
。这将返回正确的结果数,users?profile.age[eq]=36
也是如此。它们都返回正确的结果数。
在我的控制器中,我有:
export const getUsers = asyncHandler(async (req, res, next) => {
let query;
let queryStr = JSON.stringify(req.query);
queryStr = queryStr.replace(
/\b(gt|gte|lt|lte|in|elemMatch|eq)\b/g,
(match) => `$${match}`
);
query = JSON.parse(queryStr);
const users = await User.find(query);
if (!users) {
next(new ErrorResponse(`Unable to get users.`, 500));
} else {
res.status(200).json({
success: true,
count: users.length,
data: users,
});
}
});
在这里记录查询将得到{ 'profile.age': { '$lte': '36' } }
,我认为它是正确的
所以基本上每次我使用lt
lte
gt
gte
时,它都会抛出这个错误:CastError: Cast to Number failed for value "{ '$lte': '36' }" (type Object) at path "profile.age" for model "User"
任何帮助都很感激。
谢谢!
编辑:我还尝试了query-to-mongo
,以防我处理查询不正确,但它返回相同的错误。
编辑2:即使只是这样:
const users = await User.find({
"profile.age": { $lte: 100 },
});
返回错误
3条答案
按热度按时间xdnvmnnf1#
我也面临同样的问题。 Mongoose 不能过滤数字串。所以我想出了这个主意。下面的函数检查多达2级。希望这将为您工作
9q78igpj2#
我是这样设计的:
我不知道为什么
User.aggregate
工作而User.find()
不工作,但这似乎是以完全相同的方式工作。omhiaaxx3#
如果将
sanitizeFilter
设置为true
,则将其重新设置为false
可能会解决此问题。