Loopback 3 updateAll 过滤器不工作
Loopback 3 updateAll filter is not working
我在 Loopback 3 中有以下模型:
{
"name": "rehearsalTest",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {
"creationDate": {
"type": "date"
},
"userId": {
"type": "string",
"required": true
},
"courseId": {
"type": "string",
"required": true
},
"templateId": {
"type": "string",
"required": true
},
"testId": {
"type": "string",
"required": true
},
"grade": {
"type": "string",
"required": false
}
},
"validations": [],
"relations": {},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$unauthenticated",
"permission": "DENY"
},
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
}
],
"methods": {}
}
看起来很简单,我在Mongo中的数据是这样显示的:
我只想更新已创建行中的成绩,按 testId
过滤。我已经这样做了很多次,但是这个不起作用,原因我似乎无法理解。
首先我尝试了:
await RehearsalTest.updateAll({testId: testId}, {grade: grade}, (err, data) => {
console.log('rehearsalTest.updateAll', err, data);
});
这 return 是 {count: 0}
。
所以我尝试了 like,因为有时它会起作用:
await RehearsalTest.updateAll({testId: {like: testId}}, {grade: grade}, (err, data) => {
console.log('rehearsalTest.updateAll', err, data);
});
抛出这个异常:
Error: The testId property has invalid clause {"like":"60afbc93f30a9f7807fc95d1"}: Expected a string or RegExp
有趣的是,如果我转到环回浏览器和过滤器,它会完美运行:
我也尝试使用 find
和 findOne
,但没有成功。如果没有 like
子句,它不会 return 任何东西,或者它 return 是上面显示的异常。
有什么想法吗?我将永远感激不已。
编辑
数据库中的字符串似乎与我正在比较的字符串不完全相同。但我还没有发现到底发生了什么。这个console.log:
console.log(`"${rehearsalTest.testId}"`, `"${testId}"`,
`${rehearsalTest.testId}`, `${testId}`,
`"${rehearsalTest.testId}"` === `"${testId}"`,
`${rehearsalTest.testId}` === `${testId}`,
rehearsalTest.testId === testId,
rehearsalTest.testId == testId,
);
returns:
"60b652d4e31a1d54e086570d" "60b652d4e31a1d54e086570d" 60b652d4e31a1d54e086570d 60b652d4e31a1d54e086570d
true true false true
所以很明显有些东西使这两个字符串不完全相等,但现在我真的看不出 什么。
所以问题是我的函数直接从对象 test
接收 testId
,如 test.id
。
这个 id
,即使它在 console.log
中显示为 string
,但在内部它是一个对象,因此无法正确比较。
当我将 test.id 更改为 "${test.id}"
时,一切正常。
我要自杀了,谢谢。
我在 Loopback 3 中有以下模型:
{
"name": "rehearsalTest",
"base": "PersistedModel",
"idInjection": true,
"options": {
"validateUpsert": true
},
"properties": {
"creationDate": {
"type": "date"
},
"userId": {
"type": "string",
"required": true
},
"courseId": {
"type": "string",
"required": true
},
"templateId": {
"type": "string",
"required": true
},
"testId": {
"type": "string",
"required": true
},
"grade": {
"type": "string",
"required": false
}
},
"validations": [],
"relations": {},
"acls": [
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$unauthenticated",
"permission": "DENY"
},
{
"accessType": "*",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
}
],
"methods": {}
}
看起来很简单,我在Mongo中的数据是这样显示的:
我只想更新已创建行中的成绩,按 testId
过滤。我已经这样做了很多次,但是这个不起作用,原因我似乎无法理解。
首先我尝试了:
await RehearsalTest.updateAll({testId: testId}, {grade: grade}, (err, data) => {
console.log('rehearsalTest.updateAll', err, data);
});
这 return 是 {count: 0}
。
所以我尝试了 like,因为有时它会起作用:
await RehearsalTest.updateAll({testId: {like: testId}}, {grade: grade}, (err, data) => {
console.log('rehearsalTest.updateAll', err, data);
});
抛出这个异常:
Error: The testId property has invalid clause {"like":"60afbc93f30a9f7807fc95d1"}: Expected a string or RegExp
有趣的是,如果我转到环回浏览器和过滤器,它会完美运行:
我也尝试使用 find
和 findOne
,但没有成功。如果没有 like
子句,它不会 return 任何东西,或者它 return 是上面显示的异常。
有什么想法吗?我将永远感激不已。
编辑 数据库中的字符串似乎与我正在比较的字符串不完全相同。但我还没有发现到底发生了什么。这个console.log:
console.log(`"${rehearsalTest.testId}"`, `"${testId}"`,
`${rehearsalTest.testId}`, `${testId}`,
`"${rehearsalTest.testId}"` === `"${testId}"`,
`${rehearsalTest.testId}` === `${testId}`,
rehearsalTest.testId === testId,
rehearsalTest.testId == testId,
);
returns:
"60b652d4e31a1d54e086570d" "60b652d4e31a1d54e086570d" 60b652d4e31a1d54e086570d 60b652d4e31a1d54e086570d
true true false true
所以很明显有些东西使这两个字符串不完全相等,但现在我真的看不出 什么。
所以问题是我的函数直接从对象 test
接收 testId
,如 test.id
。
这个 id
,即使它在 console.log
中显示为 string
,但在内部它是一个对象,因此无法正确比较。
当我将 test.id 更改为 "${test.id}"
时,一切正常。
我要自杀了,谢谢。