使用MongoDB Driver与C#查询GroupMembers中属于People.Groups的UserId
使用MongoDB Driver for C# 筛选符合条件的GroupMembers用户ID
集合数据结构
Post:[{ PostId:5, CreateByUserId:"james", Privacy: "People", People: { Groups:[1,2], Friends:["simon","oliver"] }, GroupMembers:[{UserId:"kevin",GroupId: 1},{UserId:"george", GroupId:1},{UserId:"jack",GroupId: 2}] }]
需求
提取GroupMembers中GroupId存在于当前文档People.Groups列表内的UserId。
实现方式
1. LINQ 查询方式
利用MongoDB Driver的LINQ支持,结合投影操作筛选目标成员:
// 按实际需求设置筛选条件,此处以PostId=5为例 var filter = Builders<Post>.Filter.Eq(p => p.PostId, 5); var projection = Builders<Post>.Projection .ElemMatch(p => p.GroupMembers, member => p.People.Groups.Contains(member.GroupId)); var matchedPost = await mongoCollection.Find(filter).Project(projection).FirstOrDefaultAsync(); // 提取最终的UserId列表 var targetUserIds = matchedPost?.GroupMembers.Select(m => m.UserId).ToList();
2. 聚合管道方式
若需更灵活的复杂操作,可使用聚合管道实现:
var pipeline = new BsonDocument[] { new BsonDocument("$match", new BsonDocument("PostId", 5)), new BsonDocument("$project", new BsonDocument { { "TargetUserIds", new BsonDocument("$map", new BsonDocument { { "input", new BsonDocument("$filter", new BsonDocument { { "input", "$GroupMembers" }, { "as", "member" }, { "cond", new BsonDocument("$in", new BsonArray { "$$member.GroupId", "$People.Groups" }) } }) }, { "as", "matchedMember" }, { "in", "$$matchedMember.UserId" } }) } }) }; var aggregateResult = await mongoCollection.Aggregate<BsonDocument>(pipeline).FirstOrDefaultAsync(); var targetUserIds = aggregateResult?["TargetUserIds"].AsBsonArray.Select(id => id.AsString).ToList();
内容的提问来源于stack exchange,提问作者Kaveh Naseri
相关产品推荐
相关产品推荐

