原始帖子
在 StrongLoop 中,"in"过滤器不适用于字符串类型的字段。我在这里发帖,看看是否有其他人看到过这个问题,或者它是否是 StrongLoop MongoDB 连接器中的已知问题。还要看看是否有任何解决方法。
它确实适用于整数类型字段。但是当我在字符串类型上测试它时,它不会返回任何内容。
我直接在我的数据库MongoDB命令行中尝试了相同的查询,整数和字符串过滤器都有效。所以我知道我的格式是正确的,并且我正在尝试的查询是有效的。
这是我在 StrongLoop 模型自定义 API 中使用的代码的一部分,用于使用 in 筛选器查询数据库。
这工作正常:
Grades.find({where: {grade: {in:[1,2]} }},
这不起作用:
Grades.find({where: {subject: {in:["math","biology"]} }},
我没有在这里放太多代码,因为这需要数据库设置和强循环设置,请告诉我,如有必要,我可以添加更多代码。
谢谢卡洛斯
附加调试#1:发布我的连续调试中的一些笔记。
问题似乎不在 mongo-db 连接器之外。调试以下连接器(环回连接器-mongodb/lib/mongodb.js)后,我看到当字段类型为字符串时,"函数 all"正在接收不正确的过滤器。
loopback-connector-mongodb/lib/mongodb.js:
//
// Find matching model instances by the filter
//
// param {String} model The model name
// param {Object} filter The filter
// param {Function} [callback] The callback function
//
MongoDB.prototype.all = function all(model, filter, options, callback) {
var self = this;
if (self.debug) {
debug('all', model, filter);
}
console.log("carlos999: HERE!!!!");
if(filter.where['subject']){
console.log('carlos998: cond:%s cond.constructor.name:%s', filter.where['subject'], filter.where['subject'].constructor.name);
}
if(filter.where['grade']){
console.log('carlos997: cond:%s cond.constructor.name:%s', filter.where['grade'], filter.where['grade'].constructor.name);
}
我的模型:
"grade": {
"type": "number",
"required": true
},
"subject": {
"type": "string",
"required": true
},
在下面的示例代码中,您可以看到当字段类型为 Integer 时如何正确处理 Array(在这种情况下,出于调试目的,我在数组中传递了字符串值,您可以看到它们如何一直传播到 MongoDB 调用)。但在字符串类型字段("主题")的情况下。数组未正确处理。
这种情况工作正常
查询:
Grades.find({where: {grade: {in:["math","biology"]} }},
输出:
carlos997: cond:[object Object] cond.constructor.name:Object
carlos929: cond:[object Object] cond.constructor.name:Object
carlos29: k:grade cond:[object Object] cond.constructor.name:Object cond.options:undefined
carlos: propName:grade prop:[object Object]
carlos: spec: in k:grade cond:math,biology cond.constructor.name:Array cond.options:undefined
carlos: MongoDB: model=grades command=find [ { importance: { '$in': [Object] } }, [Function] ]
这种情况有一个问题(可能是强循环错误):
查询:
Grades.find({where: {subject: {in:["math","biology"]} }},
输出:
carlos998: cond:[object Object] cond.constructor.name:String
carlos929: cond:[object Object] cond.constructor.name:String
carlos29: k:subject cond:[object Object] cond.constructor.name:String cond.options:undefined
carlos: propName:subject prop:[object Object]
carlos: spec: false k:subject cond:[object Object] cond.constructor.name:String cond.options:undefined
carlos: MongoDB: model=grades command=find [ { subject: '[object Object]' }, [Function] ]
我正在继续调试,但如果其他人加入这项工作,那就太好了。
谢谢卡洛斯
附加调试 #2:更多调试说明
确认问题与字符串类型有关。我将模型更改为使用"数字"而不是"字符串",只是为了确认$in过滤器使用的数组得到了正确处理。事实上,它奏效了。
型号变更:
"grade": {
"type": "number", //changed from string
"required": true
},
"subject": {
"type": "number",
"required": true
},
输出:
carlos998: cond:[object Object] cond.constructor.name:Object
carlos929: cond:[object Object] cond.constructor.name:Object
carlos29: k:subject cond:[object Object] cond.constructor.name:Object cond.options:undefined
carlos: propName:subject prop:[object Object]
carlos: spec: in k:subject cond:math,biology cond.constructor.name:Array cond.options:undefined
carlos: MongoDB: model=grades command=find [ { subject: { '$in': [Object] } }, [Function] ]
我认为您的运算符名称"in"拼写错误,shuold 为"inq"。
从环回的文档:
inq 运算符检查指定属性的值是否与数组中提供的任何值匹配。 一般语法为:
{ where: { property: { inq: [val1, val2, ...] } } }
哪里: 属性是要查询的模型中属性(字段)的名称。 val1、val2 等是数组中的文字值。