字段必须是 BSON 类型的对象

Sur*_*ati 5 arrays json mongodb node.js mongodb-query

我正在创建一个动态过滤器对象,用于从 nodejs 中的 mongodb 查询数据。但是 mongo 抛出错误“无法解析过滤器对象,过滤器必须是 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);
    });
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

chr*_*dam 5

您的filter变量是一个数组,而不是一个对象,并且find()查询接受一个对象,而不是一个数组。例如,您的最终filter对象应具有此结构

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

所以你需要改变部分

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

var filter = {};
filter["$and"] = andQry;
filter["$or"] = orQry;
logger.debug("filter : ",filter);
Run Code Online (Sandbox Code Playgroud)