强循环:"in"过滤器对字符串类型不起作用



原始帖子

在 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 等是数组中的文字值。

最新更新