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

问题描述 投票:0回答:2

我有这个型号:

{
    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 <'model>而不是builder <'modelItem>,但是如何增加子属性?

c# mongodb mongodb-.net-driver
2个回答
0
投票

只需执行更新

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

0
投票

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

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

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}
});
© www.soinside.com 2019 - 2024. All rights reserved.