UpdateOneAsync 不支持表达式树

在调用 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 关键字,但很难准确判断问题出在哪里。


智慧大石
浏览 97回答 1
1回答

慕森卡

当您尝试构建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);
打开App,查看更多内容
随时随地看视频慕课网APP