MongoDB如何正确筛选contacts数组中ContactGroup不含Club的记录
MongoDB查询问题:筛选ContactGroup完全不包含「Club」的联系人
需要从MongoDB的phonenumbers集合的contacts数组中,筛选出ContactGroup完全不包含「Club」的联系人记录,即最终仅返回ContactName为Ravi的对象。
MongoDB中的数据截图如下:
现有查询及问题
当前执行的查询语句如下:
db.phonenumbers.aggregate( [{$match:{"userName" : "Veer"}}, {$unwind : "$contacts"}, {$unwind : "$contacts.ContactGroup"}, {$match:{"contacts.ContactGroup":{$ne:"Club"}}}, {$project : { "contacts.ContactName":1,"contacts.ContactGroup":1,_id : 0}} ])
该查询返回结果不符合预期,除了Ravi的记录外,同时返回了Ram、Santosh的记录:
{ contacts: { ContactName: 'Ravi', ContactGroup: 'Family' } } { contacts: { ContactName: 'Ravi', ContactGroup: 'Business' } } { contacts: { ContactName: 'Ram', ContactGroup: 'Friends' } } { contacts: { ContactName: 'Santosh', ContactGroup: 'Business' } }
问题根源在于:先拆分了ContactGroup数组再过滤,仅排除了单条值为Club的分组记录,没有把「只要任意一个分组包含Club就剔除整个联系人」的逻辑加进去,所以Ram、Santosh这类存在Club分组的联系人,剩余的非Club分组仍然会被返回。
修正后的查询方案
db.phonenumbers.aggregate([ // 匹配目标用户 {$match:{"userName" : "Veer"}}, // 拆分contacts数组得到单条联系人记录 {$unwind : "$contacts"}, // 核心筛选:仅保留ContactGroup数组完全不包含Club的联系人 {$match:{"contacts.ContactGroup":{$nin:["Club"]}}}, // 可选:需要拆分展示每个ContactGroup时保留这行,不需要可以删除 {$unwind : "$contacts.ContactGroup"}, // 投影返回需要的字段 {$project : { "contacts.ContactName":1,"contacts.ContactGroup":1,_id : 0}} ])
执行后将仅返回Ravi的相关记录,符合需求。
内容的提问来源于stack exchange,提问作者vera kum
相关产品推荐
相关产品推荐

