如何使用多个ORdynamic地构buildMongoDB查询?

我希望能够使用具有多个OR的节点dynamic地构buildMongo查询。 此查询的重点是在数据库中使用多个search词进行ANDsearch。

例如,假设有人想要search包含“狗”和“谷类”的logging。 该查询只会返回logging中某处有“dog”和“cereal”的logging(即search条件可能出现在不同的列中)。

我知道查询应该看起来像这样:

query = { $and: [ {$or: [ {col1: {$regex: "first", $options: "i"}}, {col2: {$regex: "first", $options: "i"}} ]}, {$or: [ {col1: {$regex: "second", $options: "i"}}, {col2: {$regex: "second", $options: "i"}} ]} ] } 

但是,我的节点代码并没有产生这个结果。 这是我得到的最接近的结论:

 var regexQueryWrapper = {}; regexQueryWrapper["$and"] = []; var wrapper = {}; wrapper["$or"] = []; var query = {}; searchTerms.forEach(function(term) { searchFields.forEach(function(field) { query[field] = {$regex: term, $options: 'i'}; wrapper["$or"].push(query); }); regexQueryWrapper["$and"].push(wrapper); }); 

做这个的最好方式是什么? 我错过了一个不同的方法吗?

你很近 你似乎在重复使用对象。 以下是一些调整后的代码,用于构build您正在查找的查询,并在每个forEach迭代中重新初始化临时对象:

 var regexQueryWrapper = {}; regexQueryWrapper["$and"] = []; searchTerms.forEach(function(term) { var wrapper = {"$or": []}; searchFields.forEach(function(field) { var query = {}; query[field] = {$regex: term, $options: 'i'}; wrapper["$or"].push(query); }); regexQueryWrapper["$and"].push(wrapper); }); 

还有一个使用map的替代实现:

 var query = {"$and": searchTerms.map(function(term) { return {"$or": searchFields.map(function(field) { var o = {}; o[field] = {"$regex": term, "$options": "i"}; return o; })}; })}; 

我觉得你过于复杂了。

一步一步build立你的查询,通过考虑你操纵的事实,主要是两个嵌套数组( and和)。

用一个推送数组的函数和另一个返回数组的函数,NodeJS代码将是:

 query = {and: []}; function add_and(or_query) { query["and"].push({or: or_query}); } function build_or_query(term) { return [ {col1 : {$regex: term, $options: "i"}}, {col2: {$regex: term, $options: "i"}} ] } 

重命名并使用这些函数,如您在代码中看到的那样来pipe理用户input事件。 你也可以合并他们,如果你想确保非常紧凑的代码:

 function add_and(term) { query["and"].push({or: [ {col1 : {$regex: term, $options: "i"}}, {col2: {$regex: term, $options: "i"}} ]}); } 

使用像(两个function):

 add_and(build_or_query('test1')); add_and(build_or_query('test2')); 

或者像(一个function):

 add_and('test1'); add_and('test2'); 

结果:

 { and: [ { or: [ { col1: { '$regex': 'test1', '$options': 'i' } }, { col2: { '$regex': 'test1', '$options': 'i' } } ] }, { or: [ { col1: { '$regex': 'test2', '$options': 'i' } }, { col2: { '$regex': 'test2', '$options': 'i' } } ] } ] }