C#中过滤MongoDB指定条件对象数组及AnyIn与In的区别
MongoDB C# 查询及AnyIn/In区别解析
一、过滤符合条件的文档
你需要筛选出info数组中存在**同一个元素同时满足name为John、random数组包含"31"**的文档,以下是两种实现方式:
方式1:使用FilterDefinitionBuilder(灵活适配弱类型/强类型)
弱类型(BsonDocument)写法
var collection = mongoDatabase.GetCollection<BsonDocument>("你的集合名"); // 用ElemMatch确保匹配info数组中同一个元素的两个条件 var filter = Builders<BsonDocument>.Filter.ElemMatch("info", Builders<BsonDocument>.Filter.And( Builders<BsonDocument>.Filter.Eq("name", "John"), Builders<BsonDocument>.Filter.AnyEq("random", "31") ) ); var matchedDocs = await collection.Find(filter).ToListAsync();
强类型实体写法
先定义对应实体类:
public class UserDoc { public int _id { get; set; } public List<InfoItem> info { get; set; } } public class InfoItem { public string name { get; set; } public List<string> random { get; set; } }
再写查询逻辑:
var collection = mongoDatabase.GetCollection<UserDoc>("你的集合名"); var filter = Builders<UserDoc>.Filter.ElemMatch( u => u.info, i => i.name == "John" && i.random.Contains("31") ); var matchedDocs = await collection.Find(filter).ToListAsync();
方式2:使用LINQ查询(强类型更简洁)
var matchedDocs = await collection.AsQueryable<UserDoc>() .Where(u => u.info.Any(i => i.name == "John" && i.random.Contains("31"))) .ToListAsync();
二、AnyIn与In的核心区别
1. In:匹配单个字段值
作用于非数组类型的字段,检查字段的单个值是否在指定集合中。比如判断用户状态是"active"或"pending":
// 匹配status字段为active或pending的文档 var filter = Builders<UserDoc>.Filter.In("status", new[] { "active", "pending" });
2. AnyIn:匹配数组字段的元素
作用于数组类型的字段,检查数组中是否存在至少一个元素属于指定集合。比如判断random数组包含"31"或"tv":
// 匹配random数组有"31"或"tv"的文档 var filter = Builders<UserDoc>.Filter.AnyIn("random", new[] { "31", "tv" });
本质差异
In是对单个值做判断,字段本身不是数组;AnyIn是对数组内的元素做判断,字段必须是数组类型。
回到你的需求,random是数组,所以要用AnyEq(单个值匹配)或AnyIn(多值匹配),不能用In——In会把整个random数组当成一个整体去和目标值比较,显然不符合预期。
内容的提问来源于stack exchange,提问作者tony nguyen
相关产品推荐
相关产品推荐

