如何检查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
相关产品推荐
相关产品推荐

