MongoDb 数据库中的递增子文档字段
Increment sub document field in a MongoDb Database
我有这个型号:
{
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);
但是我不知道如何执行query/update。
this.Collection.FindOneAndUpdate(query, update);
当然我不能使用这个 UpdateDefinition,因为我必须使用 builder<'model> 而不是 builder<'modelItem>,但是如何增加子 属性?
只需执行更新
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);
我终于找到了如何增加子文档:
查询保持不变,我使用运算符 $ 更新适当的数组项:
Builders<Model>.Update.Inc("Items.$.Amount", incrementValue);
对于更复杂的增量,我使用数组过滤器:
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}
});
我有这个型号:
{
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);
但是我不知道如何执行query/update。
this.Collection.FindOneAndUpdate(query, update);
当然我不能使用这个 UpdateDefinition,因为我必须使用 builder<'model> 而不是 builder<'modelItem>,但是如何增加子 属性?
只需执行更新
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);
我终于找到了如何增加子文档:
查询保持不变,我使用运算符 $ 更新适当的数组项:
Builders<Model>.Update.Inc("Items.$.Amount", incrementValue);
对于更复杂的增量,我使用数组过滤器:
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}
});