MongoDB使用$in查询时数组为空如何返回全部记录?
MongoDB $in数组为空时返回所有数据的实现方案
你可以通过以下两种方式实现需求,优先推荐第一种动态拼接方案,性能更高:
方案1:动态构造查询条件*(推荐)*
直接在业务代码中判断$in对应的数组长度,数组非空时才添加该过滤条件,空数组时直接使用空查询对象即可返回全量数据:
// 动态传入的$in查询数组 const queryList = ["ALGOL", "Lisp"] const filter = {} if (queryList.length > 0) { filter.contribs = { $in: queryList } } // 执行查询,数组为空时filter是空对象,返回所有记录 db.bios.find(filter)
该方案可以正常利用你为contribs字段创建的索引,查询性能最优,也支持和其他过滤条件灵活组合。
方案2:单查询语句固定写法
如果你不想在业务代码中做条件判断,也可以用$or和$expr组合写固定查询语句:
const queryList = [] db.bios.find({ $or: [ // 当数组长度为0时该条件恒成立,返回所有数据 { $expr: { $eq: [ { $size: queryList }, 0 ] } }, // 数组非空时走正常$in匹配逻辑 { contribs: { $in: queryList } } ] })
该方案的缺陷是$expr会降低索引的利用效率,数据量大时查询性能不如方案1。
内容的提问来源于stack exchange,提问作者raju
相关产品推荐
相关产品推荐

