我已经向MongoDB数据库存储库类添加了一个方法,该类应该是upsert / update文档。
但是我注意到在文档上调用UpdateCustomer()
后,会创建一个新文件而旧文件未经修改。简而言之,upsert方法的行为就像一个save new方法。
为了调试问题,我检查了正在使用的过滤器,这似乎是正确的:
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
但是当我进入结果时,它显示 MatchedCount 和 ModifiedCount 为零。表明过滤器与现有文档不匹配。
我还检查了原始文档和修改过的文档的ID是否相同,它们是:
有谁知道为什么在这种情况下文档没有更新?
完整的UpdateCustomer方法如下,客户对象是我的VM的SelectedCustomer,它已被修改。:
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 });
}
我的文档在我的远程数据库中定义如下(最后两条记录显示相同的ID号):
当我在我的过滤器上调用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 :(得分:0)
记录更新时空匹配计数的解决方案是由于数据库中文档中ObjectID的格式不正确。
格式不正确:
{
"_id": "565737b6e45de21ac4fd17a5"
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}
我注意到当我创建新记录时,文档id的json以不同的格式指定。
因此导致有效更新的正确格式为:
{
"_id": {
"$oid": "565737b6e45de21ac4fd17a5"
},
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}