为了账号安全,请及时绑定邮箱和手机立即绑定

UpdateOneAsync 不支持表达式树

UpdateOneAsync 不支持表达式树

C#
智慧大石 2022-12-04 10:38:19
在调用 UpdateOneAsync 时,使用此包装器:    public async Task<UpdateResult> UpdateDocument<T>(        string sCollectionName,         Expression<Func<T, bool>> filter,         UpdateDefinition<T> update,        bool bUpsert,        System.Threading.CancellationToken cancellationToken        )    {        IMongoDatabase db = _mongoClient.GetDatabase(_optionsMonitor.CurrentValue.databasename);        IMongoCollection<T> collection = db.GetCollection<T>(sCollectionName);        return await collection.UpdateOneAsync<T>(filter, update, new UpdateOptions() { IsUpsert = bUpsert }, cancellationToken);    }像这样:private async Task<Models.Errors> UpdateDbOnSyncServerToBoardUpdate(        CancellationToken cancel,        MongoDB.Bson.BsonDocument bsonDocConfigurationToUpdate,        DateTime dtUpdated,        string sId,        int iObjectId,        string sAppName,        string sModelName        )    {        MongoDB.Driver.UpdateResult updateResult = null;        Models.Errors errors = null;        try        {            updateResult = await _db.UpdateDocument<Models.Database.NodeBoardModel>(                Constants.NodeBoardCollectionName,                node => node.Id == sId && 我收到 NotSupportedException:不支持表达式树:{document}{RemoteBoard}{apps}.SingleOrDefault(app => (app.appname == "eACM")).objects.SingleOrDefault(model => (model.name == "tag" )).config_docs我感觉我以错误的方式或以 MongoDb 不支持的方式使用 LINQ 关键字,但很难准确判断问题出在哪里。
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

当您尝试构建Update语句时,问题就开始了。正如您可能知道-1的那样,作为索引传递的值将被转换$ 位置运算符文档说_

位置 $ 运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为 $ 占位符的替换是单个值

此外,您正在尝试使用构建过滤条件,SingleOrDefault而 .NET MongoDB 驱动程序无法将其转换为任何 MongoDB 查询语法运算符。

如何解决?

您可以尝试使用位置过滤运算符语法,而不是使用位置运算符。

var filter = Builders<NodeBoardModel>.Filter.Eq(f => f.Id, sId);

var update = Builders<NodeBoardModel>.Update.Set("RemoteBoard.apps.$[app].objects.$[object].config_docs.$[configdoc].config_dt", dtUpdated);


var arrayFilters = new List<ArrayFilterDefinition>();

ArrayFilterDefinition<BsonDocument> appFilter = new BsonDocument("app.appname", new BsonDocument("$eq", sAppName));

ArrayFilterDefinition<BsonDocument> objectFilter = new BsonDocument("object.name", new BsonDocument("$eq", sModelName));

ArrayFilterDefinition<BsonDocument> configDocFilter = new BsonDocument("configdoc.config_id", new BsonDocument("$eq", iObjectId));


arrayFilters.AddRange(new[] { appFilter, objectFilter, configDocFilter });


var updateOptions = new UpdateOptions { ArrayFilters = arrayFilters };


var res = Col.UpdateOne(filter, update, updateOptions);


查看完整回答
反对 回复 2022-12-04
  • 1 回答
  • 0 关注
  • 96 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号