在C#中如何定义MongoDB过滤条件?结合Filter实体场景
搞定MongoDB对应文本与状态配对的过滤条件
嘿,我来帮你梳理清楚这个问题!你需要的是匹配文本和状态一一对应的文档,而不是文本在列表里且状态在列表里的任意组合,对吧?而且现在传入参数后要返回空数组,因为没有符合(Text="SD"且State="333")或者(Text="SD"且State="444")的文档,那咱们这么写过滤条件就对了:
正确的过滤逻辑实现
首先要明确,我们需要把每一组(text, state)配对作为一个独立的匹配条件,然后用$or把这些条件组合起来——因为只要满足其中任意一组配对就算符合要求(当然你这里没有符合的,所以返回空)。
用C#的MongoDB驱动来写的话,代码是这样的:
// 先检查参数长度是否一致,避免索引越界问题 if (texts.Count() != states.Count()) { // 这里可以根据业务需求返回空或者抛出异常 return new List<Filter>(); } // 把每个text和对应的state组装成一组And条件 var pairedConditions = texts.Zip(states, (text, state) => Builders<Filter>.Filter.And( Builders<Filter>.Filter.Eq(f => f.Text, text), Builders<Filter>.Filter.Eq(f => f.State, state) ) ).ToList(); // 用Or把所有配对条件组合起来 var finalFilter = Builders<Filter>.Filter.Or(pairedConditions); // 执行查询 var matchedDocuments = await _mongoCollection.Find(finalFilter).ToListAsync();
千万别踩这个坑!
很多人会误以为用$in就能解决,但那样会出错。比如下面这种写法:
// 错误示例!不要这么写! var wrongFilter = Builders<Filter>.Filter.And( Builders<Filter>.Filter.In(f => f.Text, texts), Builders<Filter>.Filter.In(f => f.State, states) );
这种写法会匹配所有Text在给定列表里并且State在给定列表里的文档,比如如果有个文档是Text="SD"且State="111",它也会被匹配到,这完全不符合你要的“对应文本和状态”的要求。
验证你的场景
当你传入texts=["SD"],states=["333","444"]时,生成的MongoDB查询条件是这样的:
{ "$or": [ { "Text": "SD", "State": "333" }, { "Text": "SD", "State": "444" } ] }
因为数据库里没有满足这两个子条件的文档,所以查询结果就是空数组[],正好符合你的预期。
内容的提问来源于stack exchange,提问作者André Azevedo
相关产品推荐
相关产品推荐

