我使用以下inc语句进行更新以增加字段的值
var update = Updates.Inc(x => x.Version, 1);
await collection.FindAndUpdateOneAsync(myQuery,update);
我想从版本中检索新的(或旧的)值。有内置的方法吗?
由于交易问题,我不想进行新的单独查询。
答案 0 :(得分:7)
以下是Veeram在c#中所做的事情。
var update = new UpdateDefinitionBuilder<Widget>().Inc(n => n.Version, 1);
var options = new FindOneAndUpdateOptions<Widget>();
options.ReturnDocument = ReturnDocument.After;
options.Projection = new ProjectionDefinitionBuilder<Widget>().Include(n => n.Version);
var result = col.FindOneAndUpdate<Widget>(n => true, update, options );
答案 1 :(得分:1)
您可以使用findOneAndUpdate
选项projection
来返回文档。
返回旧值
db.collection.findOneAndUpdate(
{},
{ $inc: { Version: 1 } },
{ projection: { Version : 1 }}
)
要返回更新的值,请设置returnNewDocument
标志为真
db.collection.findOneAndUpdate(
{},
{ $inc: { Version: 1 } },
{ projection: { Version : 1 }, returnNewDocument : true }
)
更多信息 https://docs.mongodb.com/manual/reference/method/db.collection.findOneAndUpdate/
答案 2 :(得分:0)
TL&DR:
使用投影在插入后返回值:
var opts = new FindOneAndUpdateOptions<BsonDocument>()
{
ReturnDocument = ReturnDocument.After
};
var result = await collection.FindOneAndUpdateAsync(filter, update, opts);
说明:
默认情况下,当您使用FindOneAndUpdateAsync()函数时,MongoDB在插入后不会返回完整的更新值。为了获得该值,您必须利用一个投影,该投影控制函数的“输出”(以通俗易懂的术语表示)。
完整用例
假设car_name是一个字符串,在上面的函数中提供。这会找到特定的汽车名称,然后分别更新其country_code和country_name。
IMongoCollection<BsonDocument> collection = this._database.GetCollection<BsonDocument>("cars");
var filter = new BsonDocument("cars", car_name);
var opts = new FindOneAndUpdateOptions<BsonDocument>()
{
ReturnDocument = ReturnDocument.After
};
var update = Builders<BsonDocument>.Update.Set("country_name",country_name).Set("country_code",country_code);
var result = await collection.FindOneAndUpdateAsync(filter, update, opts);
return result;