StrongLoop:" in"过滤器不适用于字符串类型

时间:2016-01-26 02:09:29

标签: mongodb loopbackjs strongloop

ORIGINAL POST

在StrongLoop中," in"过滤它不适用于字符串类型的字段。 我在这里发帖是为了看看是否有其他人看过这个问题,或者它是否是StrongLoop MongoDB连接器中的已知问题。另外,看看是否有任何解决方法。

它适用于整数类型字段。但是当我在字符串类型上测试它时它不返回任何东西。

我在我的数据库MongoDB命令行中直接尝试了相同的查询,并且整数和字符串过滤器都有效。所以我知道我的格式是正确的,我尝试的查询是有效的。

这是我在StrongLoop模型自定义API中使用in过滤器查询数据库的代码的一部分。

这很好用:

Grades.find({where: {grade: {in:[1,2]} }},

此操作不起作用:

Grades.find({where: {subject: {in:["math","biology"]} }},

我没有在这里放置太多代码,因为这需要数据库设置和strongloop设置,让我知道,如果需要我可以添加更多代码。

谢谢, 卡洛斯

ADDITIONAL DEBUG#1:从我的连续调试中发布一些注释。

问题似乎是在mongo-db连接器之外。调试以下连接器(loopback-connector-mongodb / lib / mongodb.js)后,我看到"功能全部"当字段类型为字符串时,正在接收不正确的过滤器。

环回连接器-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)呼叫)。但是在字符串类型字段的情况下(" subject")。阵列未正确处理。

此案例可以正常

查询:

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] ]

此案例存在问题(可能是StrongLoop错误):

查询:

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] ]

我正在继续调试,但如果其他人加入这项工作会很棒。

谢谢, 卡洛斯

ADDITIONAL DEBUG#2:更多调试说明

确认问题与String类型有关。我改变了我的模型使用"数字"而不是"字符串"只是为了确认$ 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] ]

1 个答案:

答案 0 :(得分:1)

我认为您的运营商名称"在"错误拼写,并且#34; inq"。

From loopback's doc:

  

inq 运算符检查指定属性的值是否与数组中提供的任何值匹配。一般语法是:

{ where: { property: { inq: [val1, val2, ...] } } }
  

其中:   property是要查询的模型中的属性(字段)的名称。   val1,val2等是数组中的文字值。