【问题标题】:Loopback MongoDB String Property Converted to ObjectId When Using Find Where Clause使用 Find Where 子句时将环回 MongoDB 字符串属性转换为 ObjectId
【发布时间】:2023-03-19 21:22:01
【问题描述】:

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

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

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

转换为:

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

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

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

【问题讨论】:

    标签: mongodb loopbackjs


    【解决方案1】:

    您似乎发现了框架的错误/缺陷。见这里:

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

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

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

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

    app.models.User.dataSource.connector
    

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

    【讨论】:

      【解决方案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
        },
      ...
      }
      

      【讨论】:

        【解决方案3】:

        确保在您的 Json 文件中 developerId 属性被定义为对象 示例:

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

        【讨论】:

        • 感谢您的回答,但我认为您不了解问题所在。该字段已在模型中定义。问题是关于从字符串到 ObjectId 的自动转换,在这种情况下这是不需要的。
        猜你喜欢
        • 2012-05-04
        • 2022-01-02
        • 2011-12-11
        • 2018-11-09
        • 2017-03-11
        • 2014-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多