我有一个产品集合,我有这样的文档
"_id" : ObjectId("5acb1dad698eaa7a254c9017"),
"txtProductCode" : "1233A",
"txtModelCode" : "00M",
"txtPartNo" : "00P",
"txtSerialNo" : "00S",
"txtProductName" : "Watch",
"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")
我想根据我使用的名称和traderId搜索产品
db.getCollection('product').find( {$and:[{'txtProductName':"Watch"},{"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")}]})
它的工作正常,但现在如果用户输入型号为no,那么如果用户没有输入型号,那么它也应该使用型号来搜索产品,然后它应该没有型号
所以我的问题是我必须使用像这样的案例
if(req.body.modelNo)
db.getCollection('product').find( {$and:[{'txtProductName':"Watch"},{"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")},{'txtModelCode':"00M"}]})
else
db.getCollection('product').find( {$and:[{'txtProductName':"Watch"},{"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")}]})
或者是否有办法在不制作案例的情况下执行此操作我必须为多个条件执行此操作,因此我尝试不使用案例
答案 0 :(得分:2)
首先创建查询对象,然后使用条件检查添加额外的键。在指定逗号分隔的表达式列表时,无需明确使用 $and
运算符,因为它是隐式提供的:
let query = {
'txtProductName': 'Watch',
'traderId': ObjectId('5ac5fb29b0f9b3444e6c1ef2')
};
if (req.body.modelNo) query['txtModelCode'] = req.body.modelNo;
db.getCollection('product').find(query);
如果使用 $and
运算符,您可以将其他查询推送到数组中,然后使用 $and
运算符的列表:< / p>
let andOperator = [
{ 'txtProductName': 'Watch' },
{ 'traderId': ObjectId('5ac5fb29b0f9b3444e6c1ef2') }
];
if (req.body.modelNo) andOperator.push({ 'txtModelCode': req.body.modelNo });
// if (req.body.modelNo) andOperator = [...andOperator, { 'txtModelCode': req.body.modelNo }];
db.getCollection('product').find({ '$and': andOperator });
答案 1 :(得分:1)
好吧,我会以这种方式做到这一点
首先,您应该将特定的json发送到后端。例如
[{'txtModelCode':"00M"},{'txtPartNo':"AC"},{'Yts':"xyz"}]
OR
[{'txtModelCode':"00M"},{'txtPartNo':"AC"}]
OR
[{'txtModelCode':"00M"}]
这是req.body
中您应该期望的有效负载。最后,您可以在find()
条件中使用它。像
db.getCollection('product').find( {$and:[{'txtProductName':"Watch"},
{"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")}, ...req.body]})
...
称为扩展运算符。 扩展语法允许扩展数组表达式或字符串等可迭代。详细了解here
这将使它完全动态。集合中的任何缩放都可以直接用于find
条件。你永远不必添加额外的代码行