You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:36:05