如何使用$和嵌套$或动态搜索字符串向mongoDB创建查询语句?

时间:2015-11-29 01:17:05

标签: mongodb mongodb-query

我从UI输入搜索字符串(例如'tree,orange; fresh')并将字符串发送到Node.js以使用分隔符拆分字符串,然后将它们发送到MongoDB。然后我有字符串数组

['tree', 'orange' ,’fresh’] 

如何使用嵌套$进行查询$或如下所示:

db.collection('product').find({ $and : [
      { $or : [ { ProductNameTh : 'tree' }, { ProductNameEn : 'tree' } , { ProductNameCn : 'tree' } ] },
      { $or : [ { ProductNameTh : 'orange' }, { ProductNameEn : 'orange' } , { ProductNameCn : 'orange' } ] } ,
      { $or : [ { ProductNameTh : 'fresh' }, { ProductNameEn : 'fresh' } , { ProductNameCn : 'fresh' } ] }           
] } )

但是,搜索字符串在UI中非常动态。

1 个答案:

答案 0 :(得分:0)

这里需要的是$in运算符。您在此处不需要$and运算符,因为:

  

MongoDB在指定逗号分隔的表达式列表时提供隐式AND操作。当必须在多个表达式中指定相同的字段或运算符时,必须使用带有$和运算符的显式AND。

var arr = ['tree', 'orange' , 'fresh'];
db.product.find( {
    'ProductNameTh': { '$in': arr }, 
    'ProductNameEn': { '$in': arr }, 
    'ProductNameCn': { '$in': arr }
})

您可以使用以下函数生成查询:

function queryGenerator(fields, array) { 
   var query = {}; 
   for (var ix = 0; ix < fields.length; ix++)
       query[fields[ix]] = {'$in': arr};
   return query; 
}

然后使用可以使用你的功能:

var fields = [ 'ProductNameTh', 'ProductNameEn', 'ProductNameCn' ];
var arr = ['tree', 'orange' , 'fresh'];
db.product.find(queryGenerator(fields, arr)); // or var q = queryGenerator(fields, arr); and db.product.find(q)

您在此处不需要$or运算符。