代码之家  ›  专栏  ›  技术社区  ›  ST NS

MongoDb数据库中的增量子文档字段

  •  1
  • ST NS  · 技术社区  · 6 年前

    我有这个型号:

    {
        id: long,
        items: [{
            itemId: long,
            amount: decimal
        }]
     }
    

    编辑: 我需要根据id和itemId增加金额值。

    我的查询:

    var query = Builders<model>.Filter.And(
        Builders<model>.Filter.Eq(_ => _.id, xxx),
        Builders<model>.Filter.ElemMatch(_ => _.items, _ => _.itemId == yyy)
    );
    
    var update = Builders<modelItem>.Update.Inc(_ => _.amount, incrementalAmount);
    

    但我不知道如何执行查询/更新。

    this.Collection.FindOneAndUpdate(query, update);
    

    当然,我不能使用这个UpdateDefinition,因为我必须使用builder<'型号(>);而不是生成器<'模型项(>,但如何增加子属性?

    2 回复  |  直到 6 年前
        1
  •  1
  •   pieperu    6 年前

    只需执行更新

    var query = Builders<model>.Filter.And(
        Builders<model>.Filter.Eq(_ => _.id, xxx),
        Builders<model>.Filter.ElemMatch(_ => _.items, _ => _.itemId == yyy)
    );
    
    var update = Builders<model>.Update.Inc(_ => _.amount, incrementalAmount);
    

    然后执行更新:

    this.Collection.Update(query, update);
    
        2
  •  1
  •   ST NS    6 年前

    我终于找到了如何增加子文档:

    查询保持不变,我使用运算符$更新适当的数组项:

    Builders<Model>.Update.Inc("Items.$.Amount", incrementValue);
    

    对于稍微复杂一点的增量,我使用arrayfilter:

    var caf = new BsonDocumentArrayFilterDefinition<ModelItem>(new MongoDB.Bson.BsonDocument("caf.ItemId", new MongoDB.Bson.BsonDocument("$eq", YYYY)));
    var oaf = new BsonDocumentArrayFilterDefinition<ModelItem>(new MongoDB.Bson.BsonDocument("oaf.ItemId", new MongoDB.Bson.BsonDocument("$ne", YYYY)));
    
    var query = Builders<Model>.Filter.Eq(_ => _.Id, XXXX);
    
    var update = Builders<Model>.Update.Combine(
        Builders<Model>.Update.Inc("Items.$[caf].Amount", incrementValue),
        Builders<Model>.Update.Inc("Items.$[oaf].Amount", -incrementValue)
    );
    
    await this.Collection.UpdateManyAsync(query, update, new UpdateOptions()
    {
        ArrayFilters = new List<ArrayFilterDefinition>() { caf, oaf}
    });