条件$ match Monogdb查询

时间:2019-06-10 08:12:22

标签: mongodb mongodb-query

我希望有人回答我的问题。

我正在尝试搜索查询

  1. 我的比赛会有所不同
  2. 有时用户会忘记提交输入文本

无论是否点击输入文字, 它必须返回结果(没有输入文本将返回所有数组,就像没有匹配阶段一样,带有输入文本将返回匹配数组)。

  1. 如果有输入文字
  

{$ match:{$ text:{$ search:“ bla”}}

  1. 如果没有输入文字
  

{$ match:“”}

空的输入文本返回“错误:匹配过滤器必须是对象中的表达式”

我的意思是按照以下方式,

var myMatch = {}
if( input=="bla")
{ myMatch = "{$text:  { $search: "bla" }"  }"
 else if(input=="")
{ myMatch = "" }

db.collection.aggregate([
    { "$match": myMatch} ])

返回“错误:匹配过滤器必须是对象中的表达式”

4 个答案:

答案 0 :(得分:1)

应该是

else if(input=="") { myMatch = {} }

错误显示$ match需要一个对象。

答案 1 :(得分:0)

根据条件构建查询,仅当用户在搜索中添加了任何文本时,匹配项才应存在。

答案 2 :(得分:0)

您可以编写更多通用代码。让我们从您的代码开始,看看我们可以更改的内容

function logic {
   var aggregationPipeLine= []
   if(input=="bla")
      aggregationPipeLine = [{ "$match" : {$text:  { $search: "bla" }  }}];

   performAggregataion(aggregationPipeLine, function(err, res)=> { 
     // Your code 
   });
}
function performAggregataion (pipeline, callback) {
     db.collection.aggregate(pipeline).exec(callback);
}

因此,当您要执行更多操作时,可以通过这种方式定义聚集管道。

答案 3 :(得分:0)

var myMatch = {}

if(input == "bla"){
  myMatch["$text"]={};
  myMatch["$text"]["$search"]="bla";
}

db.collection.aggregate([
{ "$match": myMatch} ])

$ match require {}对象,如果您的条件为true,则使您以管道方式$ match对象通过其他方式{}对象传递任何错误

相关问题