字段必须是BSON类型的对象

时间:2017-01-27 10:20:15

标签: arrays json node.js mongodb mongodb-query

我正在创建一个动态过滤器对象,用于在nodejs中查询来自mongodb的数据。但是mongo抛出错误"无法解析过滤器对象,过滤器必须是BSON类型对象"。这是我的参考函数代码和screen shot of logs

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);
    });
}

提前感谢。

2 个答案:

答案 0 :(得分:2)

您的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 :(得分:0)

使用Find()关键字查找特定日期范围内的期望值以获取输出,使用All()获取所有列出的输出数组

@GetMapping(value = "/example" , produces = MediaType.APPLICATION_JSON_VALUE)
public void example(){
    //do x when mycontroller.environmentvariable.enebled = true
}

@GetMapping(value = "/example" , produces = MediaType.APPLICATION_JSON_VALUE)
public void example(){
    //do y when mycontroller.environmentvariable.enebled = false
}