我希望有人回答我的问题。
我正在尝试搜索查询
无论是否点击输入文字, 它必须返回结果(没有输入文本将返回所有数组,就像没有匹配阶段一样,带有输入文本将返回匹配数组)。
{$ match:{$ text:{$ search:“ bla”}}
{$ match:“”}
空的输入文本返回“错误:匹配过滤器必须是对象中的表达式”
我的意思是按照以下方式,
var myMatch = {}
if( input=="bla")
{ myMatch = "{$text: { $search: "bla" }" }"
else if(input=="")
{ myMatch = "" }
db.collection.aggregate([
{ "$match": myMatch} ])
返回“错误:匹配过滤器必须是对象中的表达式”
答案 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对象通过其他方式{}对象传递任何错误