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"
}