Я пытаюсь сделать простой выбор в mongodb с помощью кода C#:
"_id" : ObjectId("5aa04a34294f9c8f6c0ead85"),
"Categorie" : "smartphone",
"Plafond" : 1000.0,
"SousCategorie" : [
{
"SousCategorieLibelle" : " 100-300 ",
"ValeurMin" : 100.0,
"ValeurMax" : 300.0,
"GarantieTarif" : [
{
"GarantieCode" : "VOL",
"GarantieLibelle" : "Vol",
"HT" : 0.09,
"Taxe" : 0.01,
"TTC" : 0.1,
"Franchise" : 50.0
},
{
"GarantieCode" : "BOD",
"GarantieLibelle" : "Casse et Oxydation",
"HT" : 0.06,
"Taxe" : 0.01,
"TTC" : 0.07,
"Franchise" : 50.0
},
{
"GarantieCode" : "CAT",
"GarantieLibelle" : "Catastrophes naturelles",
"HT" : 0.01,
"Taxe" : 0.01,
"TTC" : 0.02,
"Franchise" : 190.0
},
{
"GarantieCode" : "CTEC",
"GarantieLibelle" : "Catastrophes technologiques",
"HT" : 0.0,
"Taxe" : 0.0,
"TTC" : 0.0,
"Franchise" : 50.0
}
]
}
],
"Frais" : 0.02,
"Commission" : 0.02
В C# я использую этот код:
protected async void ddlcategorie_SelectedIndexChanged(object sender, EventArgs e)
{
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("tarifs");
BsonDocument filter = new BsonDocument();
filter.Add("Categorie", "smartphone");
using (var cursor = await collection.FindAsync(filter))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (BsonDocument document in batch)
{
txtValeur.Text += document["SousCategorie"]["SousCategorieLibelle"];
// txtValeur.Text += document[1][2];
}
}
}
}
И я всегда получаю сообщение об ошибке:
System.NotSupportedException : 'BsonArray does not support indexing by name (only BsonDocument does).'
но если я спрошу document.GetType().ToString();, я получу MongoDB.Bson.BsonDocument.
Что я должен делать?
Благодарность!





Проблема в том, что свойство "SousCategorie" является массивом (первый символ после : - это [), поэтому при индексировании document["SousCategorie"] верен, но возвращает BsonArray. Насколько я понимаю, это один массив элементов, поэтому вы можете взять первый элемент (используя индекс 0 или First()), а затем получить доступ к необходимому свойству
Возможно, следующий код будет работать, но я его не тестировал:
foreach(var category in document["SousCategorie"])
{
Console.WriteLine(category["SousCategorieLibelle"));
}
Так что переберите их и получите все. Вы можете использовать foreach или Select
Я пытаюсь, но не знаю, как добраться до вложенного элемента
protected async void ddlcategorie_SelectedIndexChanged(object sender, EventArgs e)
{
IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("tarifs");
BsonDocument filter = new BsonDocument();
BsonDocument projection = new BsonDocument();
projection.Add("Categorie", 1);
projection.Add("SousCategorie.ValeurMin", 1);
projection.Add("SousCategorie.SousCategorieLibelle", 1);
var options = new FindOptions<BsonDocument>()
{
Projection = projection
};
using (var cursor = await collection.FindAsync(filter, options))
{
while (await cursor.MoveNextAsync())
{
var batch = cursor.Current;
foreach (BsonDocument document in batch)
{
Console.WriteLine(document.ToJson());
}
}
}
}
Я пытаюсь получить значение "SousCategorie.SousCategorieLibelle"
>? document["SousCategorie"][0].ToString()
"{ \"SousCategorieLibelle\" : \" 100-300 \", \"ValeurMin\" : 100.0 }"
>? document["SousCategorie"][0]
{{ "SousCategorieLibelle" : " 100-300 ", "ValeurMin" : 100.0 }}
>? document["SousCategorie.SousCategorieLibelle"].ToString()
'document["SousCategorie.SousCategorieLibelle"].ToString()' a levé une exception de type 'System.Collections.Generic.KeyNotFoundException'
Я не понимаю, как я могу глубже изучить свою базу данных
Мой запрос возвращает более 1 результата (точно 3). Для 1 категории ("смартфон") я хочу получить эти 3 категории SousCategorie.SousCategorieLibelle (100-300, 300-500, 500-1000)