Loopback MongoDB String 属性 在使用 Find Where 子句时转换为 ObjectId

Loopback MongoDB String Property Converted to ObjectId When Using Find Where Clause

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

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

{where: {developerId: '55118c5fc921fa170f05080b'}}

转换为:

{where: {developerId: ObjectId('55118c5fc921fa170f05080b')}}

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

如何关闭此自动对象 ID 行为以便我可以控制 Loopback 的查询?

看来您发现了一个 bug/shortcoming 框架。看这里:

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

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

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

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

app.models.User.dataSource.connector

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

确保在您的 Json 文件中将 developerId 属性定义为对象 样本:

"Properties" {
...
    "developerId": {
      "type": {
        "required": true
      }
    }
...
}

您现在可以在模型定义 json 文件中将 strictObjectIDCoercion 标志设置为 true,以避免将 id-like 字符串强制转换为 ObjectID 类型。

文档:https://github.com/strongloop/loopback-connector-mongodb#strictobjectidcoercion-flag

这是文档中的示例:

{
  "name": "myModelName",
  "base": "PersistedModel",
  "idInjection": false,
  "options": {
    "validateUpsert": true,
    "strictObjectIDCoercion": true
  },
...
}