我有一个包含许多属性的模型。其中一个是名为“developerId”的字段,其中包含一个与MongoDB ObjectId具有相同长度和特征的字符串(实际上它是一个字符串化的ObjectId)。
当我在Node.js中使用find()方法查询模型时,查询会在执行之前更新,并且“developerId”值将转换为ObjectId,然后无法匹配数据库中的任何字符串,因为它们是字符串,而不是ObjectIds。
{where: {developerId: '55118c5fc921fa170f05080b'}}
转换为:
{where: {developerId: ObjectId('55118c5fc921fa170f05080b')}}
该字段不是id字段,在模型json定义中指定为类型:'string'。
如何关闭此auto-object-id行为,以便控制Loopback的查询?
答案 0 :(得分:4)
看起来你已经发现了框架的错误/缺点。见这里:
https://github.com/strongloop/loopback-connector-mongodb/issues/52
两个月前,该漏洞似乎仍未得到解决。欢迎来到可以节点开发的狂野西部。
您可以在短期内分叉和破解模块,同时与社区合作解决此问题。
您也可以尝试使用底层的mongo连接进行查询,然后将其映射回您的环回对象。你可以这样做:
app.models.User.dataSource.connector
我想您总是可以将您的模型的developerId字段更改为实际的ObjectId。
答案 1 :(得分:2)
现在可以在模型定义json文件中将strictObjectIDCoercion
标志设置为true
,以避免将类似id的字符串强制转换为ObjectID类型。
文档:https://github.com/strongloop/loopback-connector-mongodb#strictobjectidcoercion-flag
以下是文档中的示例:
{
"name": "myModelName",
"base": "PersistedModel",
"idInjection": false,
"options": {
"validateUpsert": true,
"strictObjectIDCoercion": true
},
...
}
答案 2 :(得分:0)
确保在您的Json文件中将developerId属性定义为object 样品:
"Properties" {
...
"developerId": {
"type": {
"required": true
}
}
...
}