【问题标题】:Query/Find to Return JSON Object in a BsonDocument在 BsonDocument 中查询/查找以返回 JSON 对象
【发布时间】:2016-07-06 19:47:33
【问题描述】:

我有这样的文件:

    { "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();

但是,这会返回整个文档。有什么方法可以获取 JSON 对象 ({"tag" : "Dept", "name" : "TestDept1"})?

我想要获取的只是“value”属性(在本例中为“yyy”),而不是整个文档。

更新:

就像 Phani 建议的那样,我能够使用以下代码完成这项工作:

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();

【问题讨论】:

    标签: c# mongodb mongodb-query bson


    【解决方案1】:

    您需要为此使用 ElemMatch 投影。

    Shell 查询:db.testing.find({Content:{$elemMatch:{"tag":"Dept"}}},{"_id":0,"Content.$":1})

    C# 查询将是

    Find(x => x.Content.Any(p => p.tag == "Dept")).Project(Builders<BsonDocument>.Projection.Exclude("_id").Include("Content.$")).ToList();

    请检查这是否有效。

    【讨论】:

    • Phani,感谢您的回复。不幸的是,我的 JSON 没有 POCO 类,因为 Content 中的对象结构是动态的。为了简单起见,我使用了一个修复结构。有什么办法不在 LINQ 中使用 POCO 类来完成这项工作?
    • Phani,我能够按照您的建议使用 .Project 结合过滤器来仅包含 Content 对象。但是,这会返回整个 Content 对象。有没有办法进一步过滤结果,使其只包含内容中的 Dept 部分?
    • Phani,再次感谢您的回复。我想我明白了。我会更新我的帖子并接受你的回答。
    • Phani,如果我还需要在文件字段上进行过滤,我将如何进行查找?我需要做这样的查询: if File = "xxxxxxx.txt" and Content.tag = "Dept"
    • 是的,你可以这样做。 Shell 代码将是这样的 ` db.testing.find({File:"xxxxxxx.txt",Content:{$elemMatch:{"tag":"Dept"}}},{"_id":0,"Content. $":1})
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多