字段必须是 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 自定义映射字段名称或类型