如何在通配符后查询多个值?

分享于2022年07月17日 mysql mysql-x-devapi 问答
【问题标题】:How can I query for multiple values after a wildcard?如何在通配符后查询多个值?
【发布时间】:2022-07-01 17:14:12
【问题描述】:

我有一个像这样的 json 对象:

{ 
   _id: "12345",
   identifier: [
      { 
         value: "1",
         system: "system1",
         text: "text!"
      },
      { 
         value: "2",
         system: "system1"
      }
   ]
}

如何使用 XDevAPI SearchConditionStr 在标识符数组中查找 value + system 的特定组合?像这样的东西,但这似乎不起作用......

collection.find("'${identifier.value}' IN identifier[*].value && '${identifier.system} IN identifier[*].system")


【解决方案1】:

通过使用 IN 运算符,幕后发生的事情基本上是对 JSON_CONTAINS() 的调用。

所以,如果你打电话:

collection.find(":v IN identifier[*].value && :s IN identifier[*].system")
  .bind('v', '1')
  .bind('s', 'system1')
  .execute()

最终被执行的是(简化的):

JSON_CONTAINS('["1", "2"]', '"2"') AND JSON_CONTAINS('["system1", "system1"]', '"system1"')

在这种情况下,这两个条件都为真,文档将被返回。

原子单元是文档(不是该文档的一部分)。因此,在您的情况下,无论 value 和/或 system 的值如何,您仍在寻找相同的文档( _id '12345' 的文档)。使用这样的语句,如果所有搜索值都是文档的一部分,则返回文档,如果不是,则不返回。

例如,以下不会产生任何结果:

collection.find(":v IN identifier[*].value && :s IN identifier[*].system")
  .bind('v', '1')
  .bind('s', 'system2')
  .execute()

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

【讨论】: