【问题标题】:How to fetch a list of values from a Bson document?如何从 Bson 文档中获取值列表?
【发布时间】:2016-03-08 18:03:59
【问题描述】:

我正在使用MongoDB.Net driver 解析存储<Country> 类型列表(包含namecode)的Json 文档。但我不确定如何从 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; }
    }
}

【问题讨论】:

  • 您是否希望在一个数组中返回所有文档中的国家子文档?
  • 我希望将国家/地区子文档中的所有国家/地区作为列表或数组返回。

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


【解决方案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; }

然后您可以使用Findstring 中的ID:

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

【讨论】:

  • 所以我尝试了以下但设置断点时结果为空: var result = await collection.Find(x => x.CountryObjectName == "countryObjName").Project(x => x.Countries).FirstOrDefaultAsync();国家列表 = 结果;有什么想法吗?
  • 您似乎将 CountryObjectName 添加到 CountryModel 中,对吧?您确定在您的数据库中存在具有预期名称的 CountryModel 吗?您可以使用以下命令从 mongo shell 检查它: db.CountryModel.find( { CountryObjectName : "countryObjName" } ) 或使用 MongoVUE 等工具
  • 好的,所以“countryObjName”必须等于我数据库中该字段的字符串值?我以为这只是一个占位符值。这是实际的字符串值“CountryListObject”。我会尝试更改为该值并报告。
  • 是的,字符串“countryObjName”应替换为包含国家/地区列表的 CountryModel 的真实名称,来自您的数据库。
  • 好的,然后我将该结果分配给 List 但是当我返回它并尝试使用此扩展方法转换为 Observable 集合时,我不能,因为它现在是 Task> 知道如何修改我当前的扩展方法以接受该类型吗? hastebin.com/ohiqafudon.vala
猜你喜欢
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 1970-01-01
  • 2020-10-19
  • 2021-11-23
相关资源
最近更新 更多