如何解决upsert过滤器的空匹配计数?

时间:2015-11-24 21:38:39

标签: lambda persistence filtering mongodb-.net-driver upsert

我已经向MongoDB数据库存储库类添加了一个方法,该类应该是upsert / update文档。

但是我注意到在文档上调用UpdateCustomer()后,会创建一个新文件而旧文件未经修改。简而言之,upsert方法的行为就像一个save new方法。

为了调试问题,我检查了正在使用的过滤器,这似乎是正确的:

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

但是当我进入结果时,它显示 MatchedCount ModifiedCount 为零。表明过滤器与现有文档不匹配。

我还检查了原始文档和修改过的文档的ID是否相同,它们是:

id match

有谁知道为什么在这种情况下文档没有更新?

完整的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号):

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));
            }
        }
    }
}

1 个答案:

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