У меня возникла следующая проблема с ДЕМО-КОДОМ (ниже):
При выполнении строка ниже...
Код: Выделить всё
var customer = collection.Find(filter).FirstOrDefault();
Код: Выделить всё
System.FormatException: An error occurred while deserializing the Header property of class Customer: Element 'id' does not match any field or property of class Header.
---> System.FormatException: Element 'id' does not match any field or property of class Header.
ПЛЮС:
Если я добавлю декоратор "[BsonIgnoreExtraElements]" для классов "Customer" и "Header", запрос выполняется без ошибок, но "header.id" имеет значение "null"...
Код: Выделить всё
[Customer]
Id [string] = "65d5fa85e4eb515ee6f6301a"
GivenName [string] = "Renata"
[Header]
Id [string] = null
Код: Выделить всё
{
"_id": {
"$oid": "65d5fa85e4eb515ee6f6301a"
},
"given_name": "Renata",
"address_filled": false,
"header": {
"id": "0945f7cd-16a8-4ea6-b87f-c24e90dcfbc6"
}
}
Цель приведенного ниже кода — запросить документ MongoDB по идентификатору его заголовка вложенный документ с помощью пакета MongoDB.Driver и сопоставьте возврат с классом C# (с помощью MongoDB.Bson).
КЛАССЫ C# ДЛЯ СОПОСТАВЛЕНИЯ ДОКУМЕНТА MONGODB (ЗАПИСЬ)
Код: Выделить всё
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
public class Header
{
[BsonElement("id")]
public string Id { get; set; }
}
public class Customer
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public ObjectId Id { get; set; }
[BsonElement("given_name")]
public string GivenName { get; set; }
[BsonElement("address_filled")]
public bool AddressFilled { get; set; }
[BsonElement("header")]
public Header Header { get; set; }
}
Используйте MongoDB.Driver для запроса документа по идентификатору в заголовке вложенный документ:
Код: Выделить всё
using MongoDB.Driver;
using System;
class Program
{
static void Main(string[] args)
{
// Connection string and database setup
var connectionString = "your_connection_string";
var client = new MongoClient(connectionString);
var database = client.GetDatabase("customers");
var collection = database.GetCollection("customers");
// Query to find the document by header id
var filter = Builders.Filter.Eq("header.id", "0945f7cd-16a8-4ea6-b87f-c24e90dcfbc6");
// Execute the query
var customer = collection.Find(filter).FirstOrDefault();
// Display the result
if (customer != null)
{
Console.WriteLine($"Customer Name: {customer.GivenName}");
Console.WriteLine($"Header ID: {customer.Header.Id}");
}
else
{
Console.WriteLine("Customer not found.");
}
}
}
ОБЪЯСНЕНИЕ
- MongoClient: создает соединение с вашим экземпляром MongoDB.
GetDatabase: извлекает базу данных по имени. - GetCollection: получает коллекцию с именем customer. code>.
- Builders.Filter.Eq: создает фильтр для поиска документа, в котором header.id равен указанному значению.
- Builders.Filter.Eq: создает фильтр для поиска документа, в котором header.id равен указанному значению.
- Builders.Filter.Eq: создает фильтр для поиска документа, в котором header.id равен указанному значению.
- Builders.Filter.Eq. li>
Найти: выполняет запрос, а функция FirstOrDefault возвращает первый соответствующий документ или значение NULL, если совпадение не найдено.
< li>BsonElement: сопоставляет свойство с соответствующим полем в документе MongoDB.
Спасибо. !
Подробнее здесь: https://stackoverflow.com/questions/788 ... arp-object
Мобильная версия