如何筛选满足arr_object特定isPaymentCompleted条件的记录ID
解决方案
MongoDB 查询语句
db.collection.find( { $expr: { $and: [ // 确保数组至少包含一个元素 { $gte: [{ $size: "$arr_object" }, 1] }, // 验证最后一个元素的isPaymentCompleted为false { $eq: [{ $arrayElemAt: ["$arr_object.isPaymentCompleted", -1] }, false] }, // 验证除最后一个外的所有元素isPaymentCompleted均为true { $allElementsTrue: { $map: { input: { $slice: ["$arr_object", 0, { $subtract: [{ $size: "$arr_object" }, 1] }] }, as: "item", in: "$$item.isPaymentCompleted" } } } ] } }, { _id: 1 } // 仅返回记录ID )
PostgreSQL 查询语句(假设arr_object类型为jsonb)
SELECT id FROM your_table WHERE -- 确保数组至少包含一个元素 jsonb_array_length(arr_object) >= 1 -- 验证最后一个元素的isPaymentCompleted为false AND (arr_object -> (jsonb_array_length(arr_object) - 1) ->> 'isPaymentCompleted')::boolean = false -- 验证除最后一个外无isPaymentCompleted为false的元素 AND NOT EXISTS ( SELECT 1 FROM jsonb_array_elements(arr_object) WITH ORDINALITY AS elem(item, idx) WHERE idx < jsonb_array_length(arr_object) AND (item ->> 'isPaymentCompleted')::boolean = false );
核心逻辑说明
无论使用哪种数据库,筛选逻辑都围绕两点:
- 确认数组最后一个元素的
isPaymentCompleted为false - 确认数组中除最后一个元素外,所有元素的
isPaymentCompleted均为true
内容的提问来源于stack exchange,提问作者Narayan Maity
相关产品推荐
相关产品推荐

