增加用户余额
var client = new MongoClient("mongodb://192.168.11.137:27019");
var session = client.StartSession();
session.StartTransaction();
var database = client.GetDatabase("MyTestDB2");
var collection = database.GetCollection<UserInfo>("UserInfo");
var update = new UpdateDefinitionBuilder<UserInfo>()
.Inc(m => m.Balance, 100);//余额增加100
var option = new FindOneAndUpdateOptions<UserInfo, UserInfo>();
option.ReturnDocument = ReturnDocument.After;//返回更新后对象try
{
var dataitem = collection.FindOneAndUpdate<UserInfo>(session, m => m.Name == "JackTan", update, option);
}
catch (MongoCommandException ex)
{
//if (ex.Code == 112) 其他事务正在修改这个文档
throw;
}
session.CommitTransaction();
创建索引
var database = client.GetDatabase("MyTestDB2");
var collection = database.GetCollection<UserInfo>("UserInfo");
var indexModel = new CreateIndexModel<UserInfo>(
Builders<UserInfo>.IndexKeys.Ascending(_ => _.Name), new CreateIndexOptions
{
Name = "UerInfo_index_name", Unique = true, //唯一值索引
});
var indexname = collection.Indexes.CreateOne(indexModel);
collection.Indexes.CreateOne( Builders<UserInfo>.IndexKeys.Hashed(m=>m.Id)); //设置Id为哈希类型,并建立索引,哈希类型是否以后分片集群做准备的
注意:索引的创建不受事务控制
查询现有索引:
collection.Indexes.List().ToList();
如何判断插入重复的数据(违法唯一值索引)
var database = client.GetDatabase("MyTestDB2");
var collection = database.GetCollection<UserInfo>("UserInfo");
try
{
collection.InsertOne(new UserInfo
{
Name = "JackTan"
});
}
catch (MongoWriteException ex)
{
if(ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
{
//插入重复数据
}
throw;
}
MongoDB监控查询命令、linq联合查询
// 创建 MongoClientSettings 对象
var settings = MongoClientSettings.FromConnectionString("mongodb://192.168.11.137:27017");
// 将 CommandLogger 设置为 MongoClientSettings 的 CommandLogger 属性
settings.ClusterConfigurator = cb => {
cb.Subscribe<CommandStartedEvent>(e =>
{
var cmd = e.Command.ToString();
});
};
var client = new MongoClient(settings);
var database = client.GetDatabase("MyTestDB");
var userinfos = database.GetCollection<UserInfo>("UserInfo").AsQueryable();
var ages = database.GetCollection<UserAge>("UserAges").AsQueryable();
var ageinfos = database.GetCollection<AgeInfo>("AgeInfos").AsQueryable();
var user = (from m in userinfos
join a in ages on m.Id equals a.UserId into aGroup
from a2 in aGroup.DefaultIfEmpty()
join b in ageinfos on a2.Id equals b.AgeId into bGroup
from b2 in bGroup.DefaultIfEmpty()
select new
{
Name = m.Name,
Time = b2.CreateTime,
Age = a2.Age
}).FirstOrDefault();