Details
Description
InnerException: "An item with the same key has already been added"
using MongoDB.Bson.Serialization;
|
using MongoDB.Driver;
|
|
namespace MongoCounterDemo
|
{
|
class Program
|
{
|
private const string ConnectionString = "mongodb://user:password@host:27017/database";
|
|
static void Main(string[] args)
|
{
|
var customerCounter = new MongoDbCounter(ConnectionString, "Customers");
|
customerCounter.GetNextNumber();
|
}
|
}
|
|
class MongoDbCounter
|
{
|
#region Constants
|
|
private const string CounterCollectionName = "Counters";
|
|
#endregion
|
|
#region Fields
|
|
private readonly string _connectionString;
|
private readonly string _counterName;
|
|
#endregion
|
|
#region Constructor
|
|
public MongoDbCounter(string connectionString, string counterName)
|
{
|
_connectionString = connectionString;
|
_counterName = counterName;
|
}
|
|
#endregion
|
|
#region Public Methods
|
|
public int GetNextNumber()
|
{
|
var client = new MongoClient(_connectionString);
|
var databaseName = new MongoUrl(_connectionString).DatabaseName;
|
var db = client.GetDatabase(databaseName);
|
var counterCol = db.GetCollection<Counter>(CounterCollectionName);
|
var filter2 = Builders<Counter>.Filter.Eq("_id", _counterName);
|
var update2 = Builders<Counter>.Update.Inc(c => c.Value, 1);
|
var options2 = new FindOneAndUpdateOptions<Counter> { IsUpsert = true, ReturnDocument = ReturnDocument.After};
|
var result2 = counterCol.FindOneAndUpdate(filter2, update2, options2);
|
|
return result2.Value;
|
}
|
|
#endregion
|
}
|
|
class Counter
|
{
|
static Counter()
|
{
|
BsonClassMap.RegisterClassMap<Counter>(cm =>
|
{
|
cm.MapIdMember(c => c.Id);
|
cm.MapProperty(c => c.Value);
|
});
|
}
|
|
public string Id { get; set; }
|
public int Value { get; set; }
|
}
|
}
|