在我的Nodejs和MongoDb应用程序中,我必须在运行时构造查询,我使用此函数来创建查询:
function buildQuery(self,setting){
var query = {$or:[]}
cl = 'tc_cl'+self.family+'_id'
att ='tc_'+self.family+'_id'
keys = Object.keys(setting)
var l = []
for( var k=0;k<keys.length;k++){
ch = keys[k]
var q = {}
q[cl] = ch
q[att] = {$in:setting[ch]}
l.push(q)
}
return {$or:l}
它给我一个这样的对象:
{$or:[{tc_clpar_id:4,tc_par_id:{$in:[79,80]}},{tc_clpar_id:5,tc_par_id:{$in:[105,106]}}]}
这是我的代码的重要部分:
function executesQuery(self,query,next){
console.log(query)
console.time('query')
self.collection.find(query).toArray(function(e,o){if(e){return console.dir(e)}
next(e,o);
console.timeEnd('query');
self.db.close();
})
}
test('executeFilter',function(t){
data = {5:[105,106],4:[79,80]}
//var query = {$or:[{tc_clpar_id:4,tc_par_id:{$in:[79,80]}},{tc_clpar_id:5,tc_par_id:{$in:[105,106]}}]};
var query = filter.buildQuery(filter,data)
console.time('filter')
filter.executesFilter(filter,query,function(e,o){
console.timeEnd('filter')
t.equal(o.length,33136)
t.end()
})
如果我将从buildQuery获取的对象传递给executionFilter它不起作用,但是如果我直接分配查询应该具有的值:{$or:[{tc_clpar_id:4,tc_par_id:{$in:[79,80]}},{tc_clpar_id:5,tc_par_id:{$in:[105,106]}}]}
,它就可以工作。
我使用assert.deepEqual
检查了我从buildQuery获得的对象是否等于{$or:[{tc_clpar_id:4,tc_par_id:{$in:[79,80]}},{tc_clpar_id:5,tc_par_id:{$in:[105,106]}}]}
并且它们是。
所以现在我真的不明白出了什么问题。