Lambda 如何解决upsert筛选器上的空匹配计数?
我已经向数据库存储库类添加了一个方法,该方法应该可以升级/更新文档 但我注意到,在对文档调用Lambda 如何解决upsert筛选器上的空匹配计数?,lambda,persistence,filtering,mongodb-.net-driver,upsert,Lambda,Persistence,Filtering,Mongodb .net Driver,Upsert,我已经向数据库存储库类添加了一个方法,该方法应该可以升级/更新文档 但我注意到,在对文档调用UpdateCustomer()后,会创建一个新文档,而旧文档不会被修改。简而言之,upsert方法的行为类似于save new方法 为了调试问题,我检查了正在使用的过滤器,这似乎是正确的: var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id); 这是重新提交的CustomerModel
UpdateCustomer()
后,会创建一个新文档,而旧文档不会被修改。简而言之,upsert方法的行为类似于save new方法
为了调试问题,我检查了正在使用的过滤器,这似乎是正确的:
var filter = Builders<CustomerModel>.Filter.Where(x => x.Id == customer.Id);
这是重新提交的CustomerModel类:
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));
}
}
}
}
名称空间mongodbap.Models
{
公共类CustomerModel:INotifyPropertyChanged
{
私有ObjectId;
私有字符串名;
私有字符串lastName;
私人字符串电子邮件;
///
///此属性用于将Id属性映射到集合中的ObjectId
///
[BsonId]
公共对象Id
{
得到
{
返回id;
}
设置
{
id=值;
}
}
[b单一元素(“名字”)]
公共字符串名
{
得到
{
返回名字;
}
设置
{
firstName=值;
RaisePropertyChanged(“名字”);
}
}
[b单一元素(“姓氏”)]
公共字符串姓氏
{
得到
{
返回姓氏;
}
设置
{
lastName=值;
RaisePropertyChanged(“姓氏”);
}
}
[b单一元素(“电子邮件”)]
公共字符串电子邮件
{
得到
{
回复邮件;
}
设置
{
电子邮件=价值;
RaisePropertyChanged(“电子邮件”);
}
}
公共事件属性更改事件处理程序属性更改;
私有void RaisePropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
}
}
记录更新时空匹配计数的解决方案是由于数据库文档中的ObjectID格式不正确造成的
格式不正确:
{
"_id": "565737b6e45de21ac4fd17a5"
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}
我注意到,当我创建一个新记录时,文档id的json是以不同的格式指定的
因此,导致有效更新的正确格式是:
{
"_id": {
"$oid": "565737b6e45de21ac4fd17a5"
},
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}
那是。。。奇怪的您的标识符的类型是什么?您确定它们在数据库中的类型相同吗?另外,您能否提供由过滤器生成的mongo查询语法?(collection.Find(filter.ToString())id类型为ObjectID,链接到db中的文档:您可以看到最后两条记录,原始记录和更新记录具有相同的id。其中,更新时应删除上一条记录。这是由我的筛选器生成的查询:“object.ToString returned”Find({\“\u id\”:ObjectID(\“5565d8adba02d54a4a78be93\”)字符串可能是我在远程数据库中设置对象id的方式有问题?“@Craigwilson你能粘贴一个CustomerModel类吗?特别是,我想到了_id字段。现在刚刚添加了模型@marcinax。”
{
"_id": "565737b6e45de21ac4fd17a5"
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}
{
"_id": {
"$oid": "565737b6e45de21ac4fd17a5"
},
"firstName": "Joe ",
"lastName": "Doe",
"email": "jd@outlook.com"
}