C# 查询/查找以返回BsonDocument中的JSON对象

C# 查询/查找以返回BsonDocument中的JSON对象,c#,mongodb,mongodb-query,bson,C#,Mongodb,Mongodb Query,Bson,我有这样一份文件: { "File" : "xxxxxxx.txt", "Content" : [ { "tag" : "Book", "name" : "TestBook1", "value" : "xxx" }, { "tag" : "Dept", "name" : "TestDept1", "

我有这样一份文件:

    { "File" : "xxxxxxx.txt",
      "Content" : [
          {   "tag" : "Book",
              "name" : "TestBook1",
              "value" : "xxx"
          },
          {   "tag" : "Dept",
              "name" : "TestDept1",
              "value" : "yyy"
          },
          {   "tag" : "Employee", 
              "name" : "TestEmployee1",
              "value" : "zzz"
          }]
    }
我可以通过以下方式找到该文档:

var filter = Builders<BsonDocument>.Filter.Eq("Content.tag", "Dept");
var result = collection.Find(filter).ToList();

为此,需要使用ElemMatch投影

此的Shell查询:db.testing.find({Content:{$elemMatch:{“tag”:“Dept”}}},{“\u id”:0,“Content.$”:1})

C#查询将是


查找(x=>x.Content.Any(p=>p.tag==“Dept”)).Project(Builders.Projection.Exclude(“\u id”).Include(“Content.$”).ToList();


请检查此操作是否正常。

您需要使用ElemMatch投影进行此操作

此的Shell查询:db.testing.find({Content:{$elemMatch:{“tag”:“Dept”}}},{“\u id”:0,“Content.$”:1})

C#查询将是


查找(x=>x.Content.Any(p=>p.tag==“Dept”)).Project(Builders.Projection.Exclude(“\u id”).Include(“Content.$”).ToList();


请检查这是否有效。

Phani,谢谢您的回复。不幸的是,我的JSON不能使用POCO类,因为内容中的对象结构是动态的。我使用固定结构只是为了简单。有没有办法不在LINQ中使用POCO类来实现这一点?Phani,我可以按照您的建议使用.Project结合过滤器来只包含内容对象。但是,这将返回整个内容对象。是否有办法进一步过滤结果,使其仅包含内容中的部门部分?Phani,再次感谢您的回复。我想我明白了。我会更新我的帖子并接受你的回答。帕尼,如果我还需要过滤文件字段,我将如何查找?我需要这样做的查询:如果File=“xxxxxxx.txt”和Content.tag=“Dept”是,你可以这样做。Shell代码类似于` db.testing.find({File:'xxxxxxx.txt',内容:{$elemMatch:{“tag”:“Dept”}}},{u id:0,“Content.$”:1})Phani,感谢您的回复。不幸的是,我的JSON不能使用POCO类,因为内容中的对象结构是动态的。我使用固定结构只是为了简单。有没有办法不在LINQ中使用POCO类来实现这一点?Phani,我可以按照您的建议使用.Project结合过滤器来只包含内容对象。但是,这将返回整个内容对象。是否有办法进一步过滤结果,使其仅包含内容中的部门部分?Phani,再次感谢您的回复。我想我明白了。我会更新我的帖子并接受你的回答。帕尼,如果我还需要过滤文件字段,我将如何查找?我需要这样做的查询:如果File=“xxxxxxx.txt”和Content.tag=“Dept”是,你可以这样做。Shell代码类似于`db.testing.find({文件:“xxxxxxx.txt”,内容:{$elemMatch:{“tag”:“Dept”}}}},{“\u id”:0,“Content.$”:1})
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();