【问题标题】:Filter + ElemMatch过滤器 + ElemMatch
【发布时间】:2025-11-22 12:10:02
【问题描述】:

我有一个这样的文件:

{ 
  "File" : "xxxxxxx.txt",
  "Content" : [
      {   "tag" : "Book",
          "name" : "TestBook1",
          "value" : "xxx"
      },
      {   "tag" : "Dept",
          "name" : "TestDept1",
          "value" : "yyy"
      },
      {   "tag" : "Employee", 
          "name" : "TestEmployee1",
          "value" : "zzz"
      }]
}

使用以下代码

var subFilter = Builders<BsonDocument>.Filter.Eq("tag", "Dept");
var filter = Builders<BsonDocument>.Filter.ElemMatch("Content", subFilter);
var result =
    collection.Find(filter)
        .Project(Builders<BsonDocument>.Projection.Exclude("_id").Include("Content.$"))
        .ToList();

我可以得到

{   
    "tag" : "Dept",
    "name" : "TestDept1",
    "value" : "yyy"
}

如果我还需要对File 字段进行过滤,我该怎么办?

所以我的查询是这样的:

If File = "xxxxxx.txt" and Content.tag = "Dept"

【问题讨论】:

  • 试试这个。 var andFilter = subFilter & filter var result = collection.Find(andFilter) .Project(Builders.Projection.Exclude("_id").Include("Content.$")) .ToList();
  • 什么驱动版本?

标签: c# mongodb mongodb-query


【解决方案1】:

使用驱动程序版本 2.2.3.3

  var fdb = Builders<BsonDocument>.Filter;
  var pdb = Builders<BsonDocument>.Projection;
  var subFilter = fdb.Eq("tag", "Note");
  var filter = fdb.And (
      fdb.Eq("File","xxxxxxx.txt"), 
      fdb.ElemMatch("Content", subFilter));
  var result = _collection
      .Find(filter)
      .Project(pdb.Exclude("_id").Include("Content.$").Include("File"))
      .ToList();

【讨论】: