gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:50:37 25 4
gpt4 key购买 nike

原帖

在 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) 后,当字段类型为字符串时,我看到“function 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 时数组是如何正确处理的(在这种情况下,出于调试目的,我在数组中传递了字符串值,您可以看到它们如何一直传播到 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] ]

这个案例有一个问题(可能是 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] ]

最佳答案

我认为您的运算符(operator)名称“in”拼错了,应该是“inq”。

From loopback's doc:

The inq operator checks whether the value of the specified property matches any of the values provided in an array. The general syntax is:

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

where: property is the name of a property (field) in the model being queried. val1, val2, and so on, are literal values in an array.

关于mongodb - StrongLoop: "in"过滤器不适用于字符串类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35005956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com