如何从Bson文档中获取值列表?

时间:2015-12-03 22:40:31

标签: c# json list mongodb-.net-driver bson

我正在使用MongoDB.Net driver在Json文档中解析,该文档存储类型<Country>的列表(包含namecode)。但我不确定如何从Bson文档中检索国家列表。

我逐步解析了解析代码,所有值都被解析为CountryModel。然后存储在返回的collection var中。

谷歌搜索带来了我this solution,但它只显示了如何按ID返回记录而不是完整列表。我想知道是否可以在这里使用Lambda重载来查找列表。

到目前为止,我已设法检索完整的文档,并将其分配到列表中:

countries = collection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult();

有谁知道如何才能获取List<Country>而不是整篇文档?

检索数据涉及的两个主要方法如下:

    public void LoadDb()
    {
        var collection = StartConnection();          
        countries = collection.Find(new BsonDocument()).ToListAsync().GetAwaiter().GetResult();

    }


    public IMongoCollection<CountryModel> StartConnection()
    {            
        var client = new MongoClient(connectionString);
        var database = client.GetDatabase("orders");
        //Get a handle on the countries collection:
        var collection = database.GetCollection<CountryModel>("countries");
        return collection;
    }

这是在以下位置解析的Json数据的示例:

{
    "_id": {
        "$oid": "565f5d3ae4b0ed465284d17a"
    },
    "countries": [
        {
            "name": "Afghanistan",
            "code": "AF"
        },
        {
            "name": "Antigua and Barbuda",
            "code": "AG"
        }
    ]
}

这是支持POCO类CountryModel

namespace MongoDBApp.Models
{
    [ImplementPropertyChanged]
    public class CountryModel
    {

        [BsonId]
        public ObjectId Id { get; set; }

        [BsonElement("countries")]
        public List<Country> countries { get; set; }



    }

    [ImplementPropertyChanged]
    public class Country
    {
        [BsonElement("name")]
        public string Name { get; set; }

        [BsonElement("code")]
        public string Code { get; set; }
    }
}

1 个答案:

答案 0 :(得分:1)

尝试投影:

 var result = await collection.Find(x => x.Id == {ObjectId}).Project(x => x.countries).FirstOrDefaultAsync();

其中 {ObjectId} 是您要从中获取国家/地区集合的CountryModel的ID。

顺便说一句:使用ObjectId有更方便的方法。您可以在模型中放置string并添加属性:

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }

然后,您可以在Find中使用string ID:

 collection.Find(x => x.Id == "sample_object_id")