如何判断BSON对象ID数组是否包含指定字符串格式ID
如何判断BSON::ObjectId数组是否包含指定字符串格式ID
你遇到的问题很常见——直接用字符串去和数组里的BSON::ObjectId对象做include?判断会返回false,核心原因是类型不匹配:数组里存的是BSON::ObjectId实例,而你要检查的是纯字符串,Ruby会认为这是完全不同的东西。
给你两种实用的解决方法:
方法一:将字符串转为BSON::ObjectId后判断(推荐)
这是最直接高效的方式,把字符串格式的ID转换成对应的BSON::ObjectId实例,再用include?检查:
changed = [BSON::ObjectId('5ae9972ea8abbc3c5484cd5e')] manager_to_remove = "5ae9972ea8abbc3c5484cd5e" # 转换后判断 changed.include?(BSON::ObjectId(manager_to_remove)) # => true
方法二:遍历数组将ObjectId转为字符串比较
如果你不想做类型转换,也可以遍历数组,把每个BSON::ObjectId实例转成字符串后和目标字符串对比:
changed.any? { |id| id.to_s == manager_to_remove } # => true
为什么你的原代码不生效?
看你在pry里的操作:
changed = [BSON::ObjectId('5ae9972ea8abbc3c5484cd5e')] manager_to_remove = "5ae9972ea8abbc3c5484cd5e" changed.include?(manager_to_remove) # => false
这里changed里的元素是BSON::ObjectId对象,而manager_to_remove是字符串,Ruby的include?会严格匹配对象的类型和值,所以返回false。
内容的提问来源于stack exchange,提问作者tomatito
相关产品推荐
相关产品推荐

