Я добавил метод в класс репозитория базы данных MongoDB, который должен обновлять или обновлять документы.Как разрешить подсчет количества совпадений в upsert-фильтре?
Но я заметил, что после вызова UpdateCustomer()
на документе создается новый и старое немодифицировано. Короче говоря, метод upsert ведет себя как новый метод сохранения.
Для того, чтобы отладить этот вопрос я проверил фильтр используется, который кажется правильным:
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
Но когда я ступаю в результате, он показывает MatchedCount и ModifiedCount от нуля , Указывает, что фильтр не соответствует существующему документу.
Я также проверил, что идентификаторы обоих исходных и измененных документов те же, что они:
Кто-нибудь знает, почему этот документ не обновляется в этом случае?
Полный метод UpdateCustomer выглядит следующим образом, объект клиент является SelectedCustomer из моей VM, который был модифицирован .:
public async Task UpdateCustomer(CustomerModel customer)
{
var collection = StartConnection();
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
var result = await collection.ReplaceOneAsync(filter, customer, new UpdateOptions { IsUpsert = true });
}
Моих документов определяется следующим образом на моих удаленной БД (последние две записей, показывающих тот же идентификационный номер):
И когда я называю ToString() на мой фильтр, следующий запрос создается:
find({ \"_id\" : ObjectId(\"5565d8adba02d54a4a78be93\") })
Это класс CustomerModel, как reuqested:
namespace MongoDBApp.Models
{
public class CustomerModel : INotifyPropertyChanged
{
private ObjectId id;
private string firstName;
private string lastName;
private string email;
/// <summary>
/// This attribute is used to map the Id property to the ObjectId in the collection
/// </summary>
[BsonId]
public ObjectId Id
{
get
{
return id;
}
set
{
id = value;
}
}
[BsonElement("firstName")]
public string FirstName
{
get
{
return firstName;
}
set
{
firstName = value;
RaisePropertyChanged("FirstName");
}
}
[BsonElement("lastName")]
public string LastName
{
get
{
return lastName;
}
set
{
lastName = value;
RaisePropertyChanged("LastName");
}
}
[BsonElement("email")]
public string Email
{
get
{
return email;
}
set
{
email = value;
RaisePropertyChanged("Email");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
Это ... странно ... Что такое тип вашего идентификатора? Вы уверены, что оба они одинаковы в базе данных? Кроме того, вы могли бы предоставить синтаксис запроса mongo, который генерируется вашим фильтром? (collection.Find (filter) .ToString()) –
Идентификатор типа ObjectID, ссылка на docs в db: http://picpaste.com/pics/customers_collection_ss-jTRdJbLL.1448462069.png Вы можете видеть, что последние два записи, оригинал и обновление имеют одинаковый идентификатор. Если предыдущее должно быть удалено при обновлении. Это запрос, сгенерированный моим фильтром: «object.ToString возвращен \t» find ({\ "_ id \": ObjectId (\ "5565d8adba02d54a4a78be93 \")}) "\t string Может быть, это проблема с тем, как я установил идентификатор объекта в моем удаленном db? "@CraigWilson –
Не могли бы вы вставить класс CustomerModel? Особенно, я думаю о поле _id. – marcinax