基于数组条件筛选符合指定规则的文档
如何实现特定条件的文档筛选?
问题背景
我有一批如下格式的文档(注意:原始内容是多个独立JSON对象,处理前建议转为合法JSON数组):
{ "people" : [ { "Gender" : "Male", "Age" : 31 }, { "Gender" : "Female", "Age" : 22 } ] } { "people" : [ { "Gender" : "Male", "Age" : 31 }, { "Gender" : "Female", "Age" : 24 } ] } { "people" : [ { "Gender" : "Male", "Age" : 31 } ] }
筛选规则
需要检索满足以下条件的所有文档:
- 若文档中存在女性(
Female),则该女性的Age必须为22; - 男性(
Male)的年龄不受任何限制。
期望返回结果
{ "people" : [ { "Gender" : "Male", "Age" : 31 }, { "Gender" : "Female", "Age" : 22 } ] } { "people" : [ { "Gender" : "Male", "Age" : 31 } ] }
实现方案
方案1:MongoDB数据库查询
如果你的文档存储在MongoDB中,可以直接用以下查询语句完成筛选:
db.collection.find({ $or: [ // 分支1:文档中完全没有女性 { "people.Gender": { $ne: "Female" } }, // 分支2:文档中有女性,且所有女性的Age都是22 { "people": { $elemMatch: { "Gender": "Female", "Age": 22 } }, "people": { $not: { $elemMatch: { "Gender": "Female", "Age": { $ne: 22 } } } } } ] })
逻辑说明:
- 第一个分支直接匹配不含女性的文档;
- 第二个分支确保两点:存在至少一个年龄为22的女性,同时不存在年龄非22的女性(即所有女性年龄都符合要求)。
方案2:JavaScript脚本本地处理
如果是本地处理JSON数据,先把原始文档整理成合法数组,再用filter方法实现筛选:
// 先将原始文档转为合法JSON数组 const docs = [ { "people" : [ { "Gender" : "Male", "Age" : 31 }, { "Gender" : "Female", "Age" : 22 } ] }, { "people" : [ { "Gender" : "Male", "Age" : 31 }, { "Gender" : "Female", "Age" : 24 } ] }, { "people" : [ { "Gender" : "Male", "Age" : 31 } ] } ]; const filteredDocs = docs.filter(doc => { // 提取文档中所有女性条目 const femaleEntries = doc.people.filter(person => person.Gender === "Female"); // 无女性则直接通过;有女性则检查所有女性年龄都是22 return femaleEntries.length === 0 || femaleEntries.every(f => f.Age === 22); }); console.log(filteredDocs);
执行这段代码后,控制台会输出你期望的结果数组。
注意事项
- 原始文档是多个独立JSON对象,处理前需要用逗号分隔并包裹在
[]中,转为合法JSON数组,否则会出现解析错误; - 如果使用其他编程语言或数据库,核心逻辑一致:要么匹配无女性的文档,要么匹配所有女性年龄均为22的文档。
内容的提问来源于stack exchange,提问作者zeus
相关产品推荐
相关产品推荐

