【问题标题】:Query nested documents with C# MongoDB使用 C# MongoDB 查询嵌套文档
【发布时间】:2015-02-10 02:30:32
【问题描述】:

我有一个名为Record 的文档,其中包含一个Athlete 作为嵌套文档。 JSON 中的结构如下所示:

{
  "Id": "000000000000000000000000",
  "Description": "sample string 1",
  "Athlete": {
    "Id": "123456789101112131415161",
    "Name": "sample string 2",
    "Username": "sample string 3",
    ...
  },
  ...
}

如何查询此结构以根据Athlete.Id 检索Record 对象? IE。如果我有运动员的 ID,我想检索他们的记录,你会怎么做?

【问题讨论】:

    标签: c# mongodb nosql


    【解决方案1】:

    您可以使用您提供的格式通过子文档字段进行查询:Athlete.Id

    db.collection_name.findOne({"Athlete.Id": "123456789101112131415161"})
    

    编辑:要在 C# 中执行此操作,您可以执行类似的操作,假设您在名为 Record 的类中定义了 Record 文档的结构:

    IMongoQuery query = Query.EQ("Athlete.Id", "123456789101112131415161");
    Record result = collection_name.FindOne(query); 
    

    或者,如果可能返回多个具有该匹配 ID 的文档:

    IMongoQuery query = Query.EQ("Athlete.Id", "123456789101112131415161");
    MongoCursor<Record> resultCursor = collection_name.FindOne(query); 
    

    【讨论】:

      【解决方案2】:

      除了已经说过的,这个blog 可以帮助您处理更复杂的情况。基本上它可能看起来像:

      records.Find(
        Query.ElemMatch("Athlete",
        Query.EQ("Id", athleteId)
      ));
      

      【讨论】:

        【解决方案3】:

        方式1:使用原始BsonDocument:(它将返回BsonDocument的列表)

        var queryString = Query.EQ("Athlete.Id", "123456789101112131415161");
        var resultBsons = collection.Find(queryString).ToList();
        

        方式2:另一种方式是使用mongodb c#驱动的Typed版本:

        定义 2 个类:

        public class Athlete
        {
            public string Id { get; set; }
            public string Name { get; set; }
            public string Username { get; set; }
        }
        
        public class Record
        {
            public string Id { get; set; }
            public string Description { get; set; }
            public Athlete Athlete { get; set; }
        }
        

        然后进行查询

        var url = new MongoUrl("mongodb://localhost");
        var client = new MongoClient(url);
        var server = client.GetServer();
        var database = server.GetDatabase("test");
        var collection = database.GetCollection<Record>("records");
        
        var query = Query<Record>.EQ(i => i.Athlete.Id, "123456789101112131415161");
        var result = collection.Find(query).ToList();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-25
          • 2016-08-16
          • 2012-10-17
          • 2016-05-07
          • 2018-03-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多