【问题标题】:How to query for Null or Missing Fields in Mysql X DevAPI?如何在 Mysql X DevAPI 中查询 Null 或 Missing 字段?
【发布时间】:2021-02-24 07:00:36
【问题描述】:

如何在 Mysql X DevAPI 中查询 null 或缺失的字段?

我尝试了.find("age IS NULL").find("age = null"),但都不起作用。

> db.createCollection('users')
> db.getCollection('users').add({ name: "foo", age: 30 })
> db.getCollection('users').add({ name: "bar", age: null })
> db.getCollection('users').find("age IS NULL")
Empty set (0.0003 sec)
> db.getCollection('users').find("age = null")
Empty set (0.0004 sec)

【问题讨论】:

    标签: mysql mysql-connector mysql-x-devapi


    【解决方案1】:

    我可以使用 MySQL Shell(我猜你正在使用的)和 Connector/Node.js 来重现它。我知道 Connector/Node.js 将正确的数据类型发送到服务器(使用 Shell,您可以使用 --trace-proto 选项检查)。

    Mysqlx.Crud.Find {
      collection {
        name: "<some_schema>"
        schema: "users"
      }
      data_model: DOCUMENT
      criteria {
        type: OPERATOR
        operator {
          name: "is"
          param {
            type: IDENT
            identifier {
              document_path {
                type: MEMBER
                value: "age"
              }
            }
          }
          param {
            type: LITERAL
            literal {
              type: V_NULL
            }
          }
        }
      }
    }
    

    这意味着这是服务器中的一些问题。

    在这种情况下,X DevAPI 表达式似乎没有产生正确的 SQL 查询。如果您查看常规日志,您应该会看到类似

    SELECT doc FROM `<some_schema>`.`users` WHERE (JSON_EXTRACT(doc,'$.age') IS NULL)
    

    问题是JSON_EXTRACT 返回的是null(JSON 类型)而不是NULL(SQL“类型”),这是 X 插件的限制。

    插件解决此问题的一种方法是将JSON_EXTRACT() 替换为JSON_VALUE(),在这种情况下将返回正确的NULL 值,但我不知道它的含义。

    作为一种解决方法,您可以随时使用

    session.sql("select doc from `<some_schema>`.`users` where json_value(doc, '$.age') is null").execute()
    

    同时,我鼓励您使用MySQL Server: Document Store: X PluginMySQL Server: Document Store: MySQL Shell 类别在https://bugs.mysql.com/ 报告错误。

    免责声明:我是 MySQL X DevAPI Connector for Node.js 的首席开发人员

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2016-07-22
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多