使用查找Where子句时,Loopback MongoDB字符串属性转换为ObjectId

Rob*_*ans 10 mongodb loopbackjs

我有一个具有许多属性的模型.其中一个是名为"developerId"的字段,它包含一个与MongoDB ObjectId具有相同长度和特征的字符串(它实际上是一个字符串化的ObjectId).

当我使用Node.js中的find()方法查询模型时,查询在执行之前会更新,并且"developerId"值将转换为ObjectId,然后无法匹配数据库中的任何字符串,因为它们是字符串,而不是的ObjectID.

{where: {developerId: '55118c5fc921fa170f05080b'}}
Run Code Online (Sandbox Code Playgroud)

转换为:

{where: {developerId: ObjectId('55118c5fc921fa170f05080b')}}
Run Code Online (Sandbox Code Playgroud)

该字段不是id字段,在模型json定义中指定为类型:'string'.

如何关闭此auto-object-id行为以便控制Loopback的查询?

Pet*_*rov 5

现在,您可以在模型定义 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
  },
...
}
Run Code Online (Sandbox Code Playgroud)


Rob*_*kal 4

看起来您已经发现了框架的错误/缺点。看这里:

https://github.com/strongloop/loopback-connector-mongodb/issues/52

截至两个月前,该错误似乎仍未解决。欢迎来到可以作为节点开发的狂野西部。

您可以在短期内分叉和破解该模块,同时与社区合作解决此问题。

您还可以尝试使用底层 mongo 连接进行查询,然后将其映射回环回对象。你可以这样得到:

app.models.User.dataSource.connector
Run Code Online (Sandbox Code Playgroud)

我想您始终可以将模型的developerId 字段更改为实际的ObjectId。