2017-01-27 5 views
2

Я создаю объект динамического фильтра для запроса данных из mongodb в nodejs. Однако mongo выдает ошибку «Не удалось проанализировать объект фильтра, фильтр должен быть объекта типа BSON». Вот мой код ссылочной функции и screen shot of logs.Поле должно быть объекта типа BSON

function GetDeviceByFilter(args, cb) { 
    var query = args.qs; 
    var andQry = []; 
    var orQry = []; 
    var type = parseInt(query.type); 
    try { 
    if(type === uType.s){ 
     andQry.push({sel: parseInt(query.idx)}); 
     if(query.isSold === "0"){ 
     orQry.push({uid: {$exists: false}}) 
     orQry.push({uid: 0}); 
     orQry.push({uid: null}); 
     } else if(query.isSold === "1"){ 
     orQry.push({uid : {$gt: 0}}); 
     } 
    } else if(type === uType.a){ 
     andQry.push({admn: parseInt(query.idx)}); 
     if(query.isSold === "0"){ 
     orQry.push({sel: {$exists: false}}) 
     orQry.push({sel: 0}); 
     orQry.push({sel: null}); 
     } else if(query.isSold === "1"){ 
     orQry.push({sid : {$gt: 0}}); 
     } 
    } 
    logger.debug("And filter ", JSON.stringify(andQry)); 
    logger.debug("or filter ", JSON.stringify(orQry)); 
    } catch (e) { 
    logger.error(e); 
    } 
    var filter = []; 
    filter.push({$and: andQry});// = [$and : {andQry}, {$or: orQry}]; 
    logger.debug("filter : ",filter); 
    var projections = { 
    uuid: 1, 
    mac: 1, 
    sim: 1, 
    imei: 1, 
    _id: 0 
    }; 
    dbClient.FindDocFieldsByFilter(devCollection, filter, projections, 0, 
    function(e, d) { 
     if(e) logger.error(e) 
     cb(d, retCode.ok); 
    }); 
} 

Тонкости благодарности заранее.

ответ

1

Ваша переменная filter представляет собой массив, а не объект, а запрос find() принимает объект, а не массив. Ваш последний filter объект должен иметь такую ​​структуру, например

var filter = { 
    "$and": [ 
     { sel: parseInt(query.idx) }, 
     { admn: parseInt(query.idx)} 
    ], 
    "$or": [ 
     { uid: {$exists: false} }, 
     { uid: 0 }, 
     { uid: null} 
    ] 
} 

Так что вам нужно изменить часть

var filter = []; 
filter.push({$and: andQry});// = [$and : {andQry}, {$or: orQry}]; 
logger.debug("filter : ",filter); 

в

var filter = {}; 
filter["$and"] = andQry; 
filter["$or"] = orQry; 
logger.debug("filter : ",filter); 
+1

Thnak вы Chirdam. Работает. –

Смежные вопросы