我从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中非常动态。
答案 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
运算符。