#c# #mongodb #mongodb-query #mongodb-.net-driver #mongodb-csharp-2.0
#c# #mongodb #mongodb-запрос #mongodb-.net-driver #mongodb-csharp-2.0
Вопрос:
Я использую драйвер c # mongo db для вставки и обновления документа. Сначала я вставляю запись, а затем пытаюсь обновить определенное поле записи, используя метод FindOneAndUpdateAsync. Я могу обновить его должным образом, но после обновления я получаю сообщение об ошибке «Отсутствует требуемый элемент ‘Name’ для свойства’Name’ класса SampleApp.Person». Я использую MongoCommunity версии 4.4.1, а драйвер mongo — 2.11.4.
Я прилагаю изображение mongo compass view для вашей справки.
Моя структура коллекции
[BsonSerializer(typeof(ImpliedImplementationInterfaceSerializer<IPerson, Person>))]
public interface IPerson
{
string Id { get; set; }
string Name { get; set; }
int Age { get; set; }
string Email { get; set; }
IAddress Address { get; set; }
bool IsActive { get; set; }
}
public class Person : IPerson
{
[BsonId]
public string Id { get; set; }
[BsonRequired]
public string Name { get; set; }
[BsonRequired]
public int Age { get; set; }
public string Email { get; set; }
public IAddress Address { get; set; }
[BsonRequired]
public bool IsActive { get; set; }
}
public interface IAddress
{
string Line1 { get; set; }
string Line2 { get; set; }
string Line3 { get; set; }
string City { get; set; }
string State { get; set; }
string Pincode { get; set; }
}
public class Address : IAddress
{
public string Line1 { get; set; }
public string Line2 { get; set; }
public string Line3 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Pincode { get; set; }
}
Мой код для вставки и обновления выглядит так, как показано ниже.
MongoClient client = new MongoClient("mongodb://localhost:27017");
var database = client.GetDatabase("test");
BsonClassMap.RegisterClassMap<Address>();
var peopleCollection = database.GetCollection<IPerson>("People");
IPerson person = new Person()
{
Age = 50,
Email = "a@a.com",
IsActive = false,
Name = "David",
Id = ObjectId.GenerateNewId().ToString()
};
try
{
await peopleCollection.InsertOneAsync(person);
IAddress address = new Address()
{
City = "Bengaluru",
Line1 = "Bengaluru",
Line2 = "Bengaluru",
Line3 = "Bengaluru",
Pincode = "560001",
State = "KA"
};
var updateDefinition = Builders<IPerson>.Update.Set(x => x.Address, address).Set(x =>
x.IsActive, true);
var filter = Builders<IPerson>.Filter.Eq(x => x.Email, "a@a.com");
FindOneAndUpdateOptions<IPerson> updateOptions = new FindOneAndUpdateOptions<IPerson>
{
IsUpsert = false,
ReturnDocument = ReturnDocument.After,
Projection = Builders<IPerson>.Projection.Include(c => c.Address)
};
IPerson updatedPerson = await peopleCollection.FindOneAndUpdateAsync(filter, updateDefinition, updateOptions);
}
catch (Exception ex)
{
string s = ex.Message;
Console.WriteLine(s);
}
Комментарии:
1. Свойства в классах должны быть общедоступными, чтобы сериализация работала.
2. Вы пробовали удалить
[BsonRequired]
и посмотреть, что вы получите в ответ? Ошибка говорит о том, что независимо от того, какое значение извлекается, в нем отсутствуетName
свойство.
Ответ №1:
Я предполагаю, что значение pre-update вообще не имеет свойства Name, поэтому, когда FindOneAndUpdateAsync
он получает данные и пытается десериализовать их (перед обновлением), он завершается ошибкой с этой ошибкой.
Два решения для этого
- Попробуйте удалить
[BsonRequired]
, чтобы избежать этой ошибки. - Попробуйте обновить все документы в экземпляре MongoDB, чтобы иметь
Name
свойство, перед запуском вашего кода.
Комментарии:
1. Удаление [BsonRequired] удалит эту ошибку. Мне любопытно узнать, обязательно ли указывать все обязательные поля во время обновления.
2. Я думаю, что этого не должно быть. Однако уже существующий документ в MongoBD должен иметь все необходимые свойства, прежде чем вы сможете его найти и обновить.
3. Не забудьте принять / проголосовать за ответы, если они покажутся вам полезными.
4. Конечно. Спасибо за быстрый ответ