字段必须是 BSON 类型的对象

Posted

技术标签:

【中文标题】字段必须是 BSON 类型的对象【英文标题】:field must be of BSON type object 【发布时间】:2017-06-12 23:56:22 【问题描述】:

我正在创建一个动态过滤器对象,用于在 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);
    );

提前致谢。

【问题讨论】:

【参考方案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);

【讨论】:

【参考方案2】:

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


    db := GetDB()
    defer db.Session.Close()

    var tempMeet []models.Meetings

    gtQuery := bson.M"$gt": start

    ltQuery := bson.M"$lt": end

    pipe := bson.M
        "$and": []bson.M
            bson.M"startTime": gtQuery,
            bson.M"endTime": ltQuery,
        ,
    

    shared.BsonToJSONPrint(pipe)

    err := db.C(models.COLLECTIONNAME).Find(pipe).All(&tempMeet)
    if err != nil 
        fmt.Println(err)
        return nil, errors.New(err.Error())
    
    return tempMeet, nil
    

【讨论】:

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

以上是关于字段必须是 BSON 类型的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何为方法 MongoDB.Bson.Serialization.BsonSerializer.Deserialize 自定义映射字段名称或类型

mongoDB-document

BSON数据格式

MongoDB_02简介

输入对象类型`TypeName`必须定义一个或多个字段

pymongo:文档必须是 dict 的实例