Mongoose $all查询中动态用户参数传递问题求助
Mongoose多规格参数$all查询失败解决方案
问题背景
定义了用于产品规格的Mongoose Schema如下:
const MoldSpecific = new Schema( { name: { en: String, ar: String, kr: String, }, values: [MoldValue.schema], }, { versionKey: false, } ); export default model("MoldSpecific", MoldSpecific); const MoldValue = new Schema( { name: { en: String, ar: String, kr: String, }, unit: { type: String, default: "" }, }, { versionKey: false, } ); export default model("MoldValue", MoldValue);
需要根据用户选择的颜色、生产年份等规格参数构建查询,尝试通过以下代码实现时始终报错:
export function getQueryParams(query) { var queryParams = {}; var specsParams = []; if (query.year) { specsParams.push({ $elemMatch: {"values._id": query.year} }); } if (query.color) { specsParams.push({ $elemMatch: {"values._id": query.color} }); } queryParams["specifics"] = { $all: [specsParams.join()], }; console.log(queryParams); return queryParams; }
报错信息:
ObjectParameterError: Parameter "obj" to Document() must be an object, got [object Object],[object Object]"
仅取数组第一个元素时代码可正常运行:
queryParams["specifics"] = { $all: [specsParams[0]], };
错误原因
核心问题出在specsParams.join():
- 调用
join()会将数组中的对象转为字符串形式(比如"[object Object],[object Object]") - MongoDB的
$all操作符要求传入对象数组,而非字符串,因此无法解析这个字符串参数,导致报错
修复后的代码
直接将specsParams数组作为$all的值,无需使用join(),同时增加空数组判断,避免不必要的查询条件:
export function getQueryParams(query) { const queryParams = {}; const specsParams = []; if (query.year) { specsParams.push({ $elemMatch: {"values._id": query.year} }); } if (query.color) { specsParams.push({ $elemMatch: {"values._id": query.color} }); } // 仅当有规格参数时才添加$all条件 if (specsParams.length > 0) { queryParams["specifics"] = { $all: specsParams }; } return queryParams; }
说明
$all本身就接受数组作为参数,直接传入specsParams即可实现“同时满足所有规格条件”的查询- 增加空数组判断是为了避免当没有任何查询参数时,生成无效的
specifics: { $all: [] }条件,确保查询逻辑严谨
内容的提问来源于stack exchange,提问作者Mohammed Riyadh
相关产品推荐
相关产品推荐

