MongoDb C#驱动程序检索增量更新的值

时间:2017-05-03 13:57:55

标签: c# .net mongodb mongodb-.net-driver

我使用以下inc语句进行更新以增加字段的值

 var update = Updates.Inc(x => x.Version, 1);
 await collection.FindAndUpdateOneAsync(myQuery,update);

我想从版本中检索新的(或旧的)值。有内置的方法吗?

由于交易问题,我不想进行新的单独查询。

3 个答案:

答案 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;