【问题标题】:MongoWriteException: A write operation resulted in an error. The positional operator did not find the match needed from the queryMongoWriteException:写入操作导致错误。位置运算符未从查询中找到所需的匹配项
【发布时间】:2019-01-22 06:21:31
【问题描述】:

我有一个如下所示的集合 Zonedetails。下面。

我正在使用 C# 插入或更新单位到单位数组。如果是插入,我可以插入区域空白。如果是更新它应该只更新 UnitName。

{ 
    "Code" : "Zone1", 
    "Name" : "ZoneName1", 
    "Units" : [
        {
            "UnitCode" : "Unitcode1", 
            "UnitName" : "UnitCodeName", 
            "Areas" : [
                {
                    "AreaCode" : "AreaCode1", 
                    "AreaName" : "AreaName1"
                }
            ]
        }
    ]
}
{ 
    "Code" : "Zone2", 
    "Name" : "ZoneName2", 
    "Units" : [
        {
            "UnitCode" : "UnitCode2", 
            "UnitName" : "UnityName2", 
            "Areas" : [
                {
                    "AreaCode" : "Areacode2", 
                    "AreaName" : "AreaName2"
                }
            ]
        }
    ]
}
{ 
    "Code" : "Zone3", 
    "Name" : "ZoneName3", 
    "Units" : [
        {
            "UnitCode" : "UnitCode3", 
            "UnitName" : "UnitName3", 
            "Areas" : [
                {
                    "AreaCode" : "Areadcode3", 
                    "AreaName" : "AreaName3"
                }, 
                {
                    "AreaCode" : "AreaCode4", 
                    "AreaName" : "Areaname4"
                }, 
                {
                    "AreaCode" : "AreaCode5", 
                    "AreaName" : "Areaname5"
                }
            ]
        }, 
        {
            "UnitCode" : "UnitCode6", 
            "UnitName" : "UnitName6", 
            "Areas" : [
                {
                    "AreaCode" : "AreaCode10", 
                    "AreaName" : "AreaName10"
                }, 
                {
                    "AreaCode" : "AreaCOde11", 
                    "AreaName" : "AreaName10"
                }, 
                {
                    "AreaCode" : "AreaCode12", 
                    "AreaName" : "AreaName12"
                }
            ]
        }
    ]
}

我已经编写了如下所示的 C# 代码。但是,如果单元代码不存在,则会出现“位置运算符未从查询中找到所需的匹配”错误。未在 unitCode 检查之前添加。

    var mongoCollection = _context.GetCollection<Zone>("ZoneDetail");
    var filter = Builders<Zone>.Filter.Where(x => x.Code == zoneCode && !x.Units.Any(u => u.UnitCode == unit.UnitCode));
    var updateUnitCode = Builders<Zone>.Update.Set(x => x.Units.ElementAt(-1).UnitCode, unit.UnitCode);
    var updateUnitName = Builders<Zone>.Update.Set(x => x.Units.ElementAt(-1).UnitName, unit.UnitName);
    var result = await mongoCollection.UpdateOneAsync(filter, Builders<Zone>.Update.Combine(updateUnitCode, updateUnitName), new UpdateOptions { IsUpsert = true});

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    您的错误消息表明过滤器无法找到匹配的元素。

    尝试更改您的输入或更改您的过滤条件。

    【讨论】:

    • 是的,你是对的。如果未找到 UnitCode,我想插入该数组。如何实现。为此,我启用了 IsUpsert = true
    • 你需要把 not 放在你的 unitcode 检查条件之前,像这样!x.Units.Any(u => u.UnitCode == unit.UnitCode)
    • paramar 能否请您更新 C# 代码。以便我对您的建议有一个清晰的了解。
    • 我认为 insert 或 update 仅适用于 Id,如果 ID 存在则它将更新,否则它将插入。它不会按照您尝试的方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多