Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用案例在mongodb中查找查询_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 使用案例在mongodb中查找查询

Node.js 使用案例在mongodb中查找查询,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个产品集合,其中有这样的文档 "_id" : ObjectId("5acb1dad698eaa7a254c9017"), "txtProductCode" : "1233A", "txtModelCode" : "00M", "txtPartNo" : "00P", "txtSerialNo" : "00S", "txtProductName" : "Watch", "traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2") if(req.body

我有一个产品集合,其中有这样的文档

"_id" : ObjectId("5acb1dad698eaa7a254c9017"),
"txtProductCode" : "1233A",
"txtModelCode" : "00M",
"txtPartNo" : "00P",
"txtSerialNo" : "00S",
"txtProductName" : "Watch",
"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")
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")}]})
我想根据我使用的产品名称和traderId搜索该产品

db.getCollection('product').find( {$and:[{'txtProductName':"Watch"},{"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")}]})
它工作正常,但是现在如果用户输入了型号,那么它应该使用型号来搜索产品如果用户没有输入型号,那么它应该没有型号

所以我的问题是我必须使用这样的用例吗

"_id" : ObjectId("5acb1dad698eaa7a254c9017"),
"txtProductCode" : "1233A",
"txtModelCode" : "00M",
"txtPartNo" : "00P",
"txtSerialNo" : "00S",
"txtProductName" : "Watch",
"traderId" : ObjectId("5ac5fb29b0f9b3444e6c1ef2")
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")}]})

或者有没有一种方法可以在不生成case的情况下执行此操作?我必须对多个条件执行此操作,因此我尝试不使用cases创建查询对象,然后使用条件检查添加额外的键。指定以逗号分隔的表达式列表时,无需显式使用运算符,因为它是隐式提供的:

let query = {
    'txtProductName': 'Watch',
    'traderId': ObjectId('5ac5fb29b0f9b3444e6c1ef2')
};

if (req.body.modelNo) query['txtModelCode'] = req.body.modelNo;
db.getCollection('product').find(query);

如果使用运算符,则可以将附加查询推送到数组中,然后使用运算符的列表:

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 });

我会这样做的

首先,您应该向后端发送一个特定from的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]})
称为扩展运算符扩展语法允许扩展数组表达式或字符串等iterable。阅读更多关于它的信息

这将使它完全充满活力。集合中的任何缩放都可以直接用于
find
条件。您永远不必添加额外的代码行