Cloudant技术问询:如何判断person数组是否为空
解决person数组空值/数据存在性判断的问题
首先得说清楚,你之前的两个选择器没生效的原因:
$exists: true是在检查数组里的对象是否包含name字段,但如果person数组本身是空的,或者数组里的对象根本没有name属性,这个条件就匹配不到;$neq: ""是检查name不等于空字符串,但同样没覆盖数组为空的情况,也没考虑数组存在但元素无name的场景。
下面根据你的实际需求给出两种解决方案:
需求1:判断person数组存在且不为空(不管元素里有没有name)
这种情况直接针对数组本身做判断即可,有两种常用写法:
方法1:用$ne匹配非空数组
"selector": { "entries.members.person": { "$ne": [] } }
这个选择器会匹配所有entries.members.person不是空数组的文档。
方法2:用$size检查数组长度大于0
如果你的查询引擎(比如CouchDB Mango)支持$size结合比较运算符,可以这么写:
"selector": { "entries.members.person": { "$size": { "$gt": 0 } } }
如果不支持比较运算符,也可以用$not反向匹配空数组:
"selector": { "entries.members.person": { "$not": { "$size": 0 } } }
需求2:判断person数组里至少有一个元素包含有效的name字段
如果需要确保数组里的元素不仅存在,还得有非空的name,就需要用$elemMatch来匹配数组内的元素:
"selector": { "entries.members.person": { "$elemMatch": { "name": { "$exists": true, "$ne": "" } } } }
这个选择器会匹配那些person数组中至少有一个对象同时满足「name字段存在」且「name不为空字符串」的文档。
额外注意
要确认你的查询引擎支持这些运算符(比如CouchDB、MongoDB的语法略有差异,但核心逻辑一致),另外要保证entries.members.person确实是数组类型,避免因为字段类型错误导致匹配失败。
内容的提问来源于stack exchange,提问作者user1888492
相关产品推荐
相关产品推荐

