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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 14:49:57