如何在c#中列出mongodb文档的所有子文档

时间:2016-12-09 21:36:43

标签: c# mongodb datagridview

我喜欢在C#的datagridview中显示mongodb文档的所有嵌入式子文档。我想不应该这么难,但到目前为止找不到任何类似的问题和有用的答案。 我使用下面的docs.mongodb.com示例:

{   
   _id: "joe",
   name: "Joe Bookreader",
   addresses: [
                {
                  street: "123 Fake Street",
                  city: "Faketon",
                  state: "MA",
                  zip: "12345"
                },
                {
                  street: "1 Some Other Street",
                  city: "Boston",
                  state: "MA",
                  zip: "12345"
                }
              ]
 }

不幸的是,它无法找到文档,然后逐步执行子文档数组,如:

var doc = Builders<BsonDocument>.Filter.Eq("_id", "joe");
foreach (var a in doc.addresses)
{
   dataGridView1.Rows[0].Cells[0].Value = a["street"].ToString();
   ...
}

尝试仅包含子文档不会将我带到子文档级别:

var result = await collection.Find(new BsonDocument("_id", "joe")).Project(Builders<BsonDocument>.Projection.Include("addresses").Exclude("_id")).ToListAsync();

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

发现结果应该被视为嵌套数组。 所以循环遍历元素能够:

    while (result[0]["addresses"][i]["_id"] != null)
    {
        DataRow dr = dtprops.NewRow();
        foreach (DataGridViewColumn col in dataGridView1.Columns)
        {
            try { dr[col.DataPropertyName] = result[0]["addresses"][i][col.DataPropertyName]; }
            catch { };
        }
        dtprops.Rows.Add(dr);
        i++;
    };
    dataGridView1.DataSource = dtprops;

我不喜欢try catch部分,但还没有发现如何避免不存在的文档字段。但这是一个不同的问题。