2015-11-24 1 views
0

Я добавил метод в класс репозитория базы данных MongoDB, который должен обновлять или обновлять документы.Как разрешить подсчет количества совпадений в upsert-фильтре?

Но я заметил, что после вызова UpdateCustomer() на документе создается новый и старое немодифицировано. Короче говоря, метод upsert ведет себя как новый метод сохранения.

Для того, чтобы отладить этот вопрос я проверил фильтр используется, который кажется правильным:

var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id); 

Но когда я ступаю в результате, он показывает MatchedCount и ModifiedCount от нуля , Указывает, что фильтр не соответствует существующему документу.

Я также проверил, что идентификаторы обоих исходных и измененных документов те же, что они:

id match

Кто-нибудь знает, почему этот документ не обновляется в этом случае?

Полный метод 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 }); 
    } 

Моих документов определяется следующим образом на моих удаленной БД (последние две записей, показывающих тот же идентификационный номер):

customers collection

И когда я называю 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)); 
      } 
     } 
    } 
} 
+0

Это ... странно ... Что такое тип вашего идентификатора? Вы уверены, что оба они одинаковы в базе данных? Кроме того, вы могли бы предоставить синтаксис запроса mongo, который генерируется вашим фильтром? (collection.Find (filter) .ToString()) –

+0

Идентификатор типа ObjectID, ссылка на docs в db: http://picpaste.com/pics/customers_collection_ss-jTRdJbLL.1448462069.png Вы можете видеть, что последние два записи, оригинал и обновление имеют одинаковый идентификатор. Если предыдущее должно быть удалено при обновлении. Это запрос, сгенерированный моим фильтром: «object.ToString возвращен \t» find ({\ "_ id \": ObjectId (\ "5565d8adba02d54a4a78be93 \")}) "\t string Может быть, это проблема с тем, как я установил идентификатор объекта в моем удаленном db? "@CraigWilson –

+0

Не могли бы вы вставить класс CustomerModel? Особенно, я думаю о поле _id. – marcinax

ответ

0

Решения нулевого отсчет матча на запись обновлений, был из-за неверный формат ObjectID в документе в базе данных.

Неверный формат:

{ 
    "_id": "565737b6e45de21ac4fd17a5" 
    "firstName": "Joe ", 
    "lastName": "Doe", 
    "email": "[email protected]" 
} 

Я заметил, что когда я создал новую запись, то для идентификатора JSON документа был указан в другом формате.

Так правильный формат, что привело к действительному обновление было:

{ 
    "_id": { 
     "$oid": "565737b6e45de21ac4fd17a5" 
    }, 
    "firstName": "Joe ", 
    "lastName": "Doe", 
    "email": "[email protected]" 
} 
Смежные вопросы