You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检查Firestore中数组各元素在fruit节点下的存在性

验证数组元素是否存在于数据库的fruit对象中

嘿,我来帮你搞定这个问题!首先得明确你的fruit对象到底是什么结构——是一个键值对对象(比如{ "apple": true, "banana": false }),还是一个数组(比如["apple", "banana", "cherry"])?两种情况的查询方式不太一样,我分别给你举例说明:

情况1:fruit是键值对对象

假设你的目标节点(文档)长这样:

{
  "nodeId": "123",
  "fruit": {
    "apple": true,
    "banana": true,
    "cherry": false
  }
}

你要检查的数组是["apple", "banana"],想确认这两个元素都是fruit对象的键。

以MongoDB为例,可以用$expr结合$allElementsTrue和$map来实现全量检查:

const checkItems = ["apple", "banana"];

// 查询单个节点,验证所有数组元素都在fruit的键中
db.yourCollection.find({
  nodeId: "123", // 定位你的目标节点
  $expr: {
    $allElementsTrue: {
      $map: {
        input: checkItems,
        as: "item",
        in: {
          $in: [
            "$$item",
            // 把fruit对象转成键数组:["apple", "banana", "cherry"]
            { $map: { input: { $objectToArray: "$fruit" }, as: "f", in: "$$f.k" } }
          ]
        }
      }
    }
  }
});

这段代码会把fruit对象的键提取成数组,然后逐一检查checkItems里的每个元素是否都在这个键数组中,只有全部存在才会返回该节点。

如果是SQL数据库(比如MySQL),可以用JSON_CONTAINS_PATH来验证:

SELECT * FROM your_table
WHERE node_id = '123'
-- 用'all'确保所有指定的键都存在于fruit对象中
AND JSON_CONTAINS_PATH(fruit, 'all', '$.apple', '$.banana');

情况2:fruit本身是数组

如果你的节点结构是这样的:

{
  "nodeId": "123",
  "fruit": ["apple", "banana", "cherry"]
}

那就简单多了!直接用数组匹配操作符即可:

MongoDB示例

const checkItems = ["apple", "banana"];

db.yourCollection.find({
  nodeId: "123",
  fruit: { $all: checkItems } // 检查fruit数组包含所有checkItems元素
});

$all操作符会确保fruit数组包含checkItems中的每一个元素,不管顺序和其他额外元素。

SQL示例(MySQL)

SELECT * FROM your_table
WHERE node_id = '123'
-- 验证fruit数组包含所有指定元素
AND JSON_CONTAINS(fruit, '["apple", "banana"]');

关键要点

  • 先明确fruit的结构:是键值对象还是数组,这决定了查询方式
  • 如果你要所有数组元素都必须存在,一定要用全量验证的逻辑(比如$allElementsTrue、$all、JSON_CONTAINS_PATH的all参数),而不是只检查单个元素

内容的提问来源于stack exchange,提问作者Shady Aziza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:11:22