MongoDB中使用C#驱动程序的原子整数计数

时间:2017-09-18 17:15:15

标签: c# mongodb atomicity

我在Mongo中有一个看起来像这样的对象:

{ 
  "_id" : ObjectId("59bffce310b7213b6c812f53"), 
  "Key" : 1.0, 
  "LatestCardId" : 1.0
}

我试图保留我在整个系统中使用的ID。我希望它是独一无二的,所以我有一个只为这个id的集合。我只会有一个实例跟踪id。我想用它在另一个集合中创建一个条目。然后该对象将返回给用户,以便他们可以使用我的新ID来访问主要集合。

我的问题在于C#驱动程序(v2.4.4)中的Update.Inc语句。我已经把所有东西都删掉了,阅读了文档,我正在努力理解我得到的例外。

数据库连接正常,这是我的代码:

var idCollection = database.GetCollection<BsonDocument>(collectionName);
var filter = Builders<BsonDocument>.Filter.Eq("Key", 1);
var update = Builders<BsonDocument>.Update.Inc("LatestCardId", filter);
var result = await idCollection.UpdateOneAsync(filter, update);

然后我得到了这个例外:

{"A write operation resulted in an error.\r\n Cannot increment with non-numeric argument: {LatestCardId: { _t: \"SimpleFilterDefinition 2 \&#34; }}&#34;}`

有谁知道我做错了什么。已经很晚了,所以我可能已经非常愚蠢了。任何帮助表示赞赏。

顺便说一下,有没有人知道我是如何使用Mongo的强类型C#版本来做到这一点的,例如:

var idCollection = database.GetCollection<CardIdObj>(collectionName);

1 个答案:

答案 0 :(得分:0)

我相信这可能是您正在寻找的,包括您的强类型收藏。

var idCollection = database.GetCollection<CardIdObj>("CardIdObj");

var filter = Builders<CardIdObj>.Filter.Eq(x => x.Key, 1);
var update = Builders<CardIdObj>.Update.Inc(x => x.LatestCardId, 1);
var result = idCollection.UpdateOne(filter, update);

您似乎正在尝试使用过滤器增加LatestCardId,但这不起作用。

或者如果你想继续使用魔法字符串:

var idCollection = database.GetCollection<BsonDocument>("CardIdObj");

var filter = Builders<BsonDocument>.Filter.Eq("Key", 1);
var update = Builders<BsonDocument>.Update.Inc("LatestCardId", 1);
var result = idCollection.UpdateOne(filter, update);