MongoDB支持C#/JAVA/PHP等主流语言进行操作,今天讲一下最简单的使用C#操作MongoDB(先下载c#对应的DLL)。说明:MongoDB的安装和运行在上一个章节已经详细讲了,今天主要是讲MongoDB的基本操作,但这里说一个小问题,当MongoDB运行时,我强制关闭了MongoDB
MongoDB
支持C#/JAVA/PHP等主流语言进行操作,今天讲一下最简单的使用C#操作MongoDB(先下载c#对应的DLL)。
说明:MongoDB
的安装和运行在上一个章节已经详细讲了,今天主要是讲MongoDB的基本操作,但这里说一个小问题,当MongoDB运行时,我强制关闭了MongoDB,当我再次启动时,发现启动失败,其实解决办法挺简单,就是删除.lock文件。
错误信息如下:
Mon Sep 19 06:14:55 [initandlisten] MongoDB starting : pid=4126
port=27017 dbpath=/usr/local/mongo/data 64-bit
Mon Sep 19 06:14:55 [initandlisten] db version v1.8.1, pdfile
version 4.5
Mon Sep 19 06:14:55 [initandlisten] git version: nogitversion
Mon Sep 19 06:14:55 [initandlisten] build sys info: Linux
localhost.localdomain 2.6.18-238.19.1.el5 #1 SMP Fri Jul 15
07:31:24 EDT 2011 x86_64
BOOST_LIB_VERSION=1_33_1
**************
old lock file: /usr/local/mongo/data/mongod.lock. probably
means unclean shutdown
recommend removing file and running --repair
see: http://dochub.mongodb.org/core/repair for more information
*************
Mon Sep 19 06:14:55 [initandlisten] exception in initAndListen
std::exception: old lock file, terminating
Mon Sep 19 06:14:55 dbexit:
Mon Sep 19 06:14:55 [initandlisten] shutdown: going to close
listening sockets...
Mon Sep 19 06:14:55 [initandlisten] shutdown: going to flush
diaglog...
Mon Sep 19 06:14:55 [initandlisten] shutdown: going to close
sockets...
Mon Sep 19 06:14:55 [initandlisten] shutdown: waiting for fs
preallocator...
Mon Sep 19 06:14:55 [initandlisten] shutdown: closing all
files...
Mon Sep 19 06:14:55 closeAllFiles() finished
Mon Sep 19 06:14:55 dbexit: really exiting now
查阅到的问题分析有一句话:
Analysis:If a server running MongoDB crashed or MongoDB did not
get to shut down cleanly for some other reason, you may not be able
to start Mongo again, getting "exception in initAndListen
std::exception: old lock file, terminating" error in Mongo error
log.
相信大家都读得懂,就不翻译了,解决办法就一句话:
Fix is actually pretty easy, you just need to locate mongod.lock
file and remove it.
解决这个问题的办法很简单,你只需要定位到mongod.lock文件,删除它即可。
进入正题:
1)简单插入对象到数据库
private void SingleInsert()
{
try
{
//此方法已过时,MongoClient.GetServer替代
//MongoServer server =
MongoDB.Driver.MongoServer.Create(strconn);
MongoClient mc = new MongoClient(strconn);
MongoServer server = mc.GetServer();
MongoDatabase db = server.GetDatabase(dbName);
MongoCollection collection = db.GetCollection("jrsc");
BsonDocument bd1 = new BsonDocument { { "name", "li jing" }, {
"age", "18" }, { "sex", "female" } };
Console.WriteLine("Record has been successfully inserted.");
collection.Insert(bd1);
}
catch (Exception ex)
{
Console.WriteLine("Error"+ex.Message);
}
}
前面通过MongoClient拿到Server,然后拿到DB,然后拿到我们想要操作的集合(这里不再是DataTable)而是Collection,基本组成元素的BsonDocument,这时候我们对Collection进行操作即可,值得注意的一点是:我们不需要调用save方法,自动帮我们把结果保存到数据库。
2)插入强类型对象到数据库
如果我们的对象式Student类型的,我们是不能直接拿简单的collection进行插入,需要拿到GetCollection类型的collection进行插入操作,这时候插入是支持的。
private static void StrongTypeObjectInsert()
{
try {
MongoClient mc = new MongoClient(strconn);
MongoServer server = mc.GetServer();
MongoDatabase db = server.GetDatabase(dbName);
MongoCollection PersOns=
db.GetCollection("jrsc");
Person p = new Person { P_ID = 1,P_NAME = "Person01" };
Persons.Insert(p);
Console.WriteLine("StrongTypeObjectInsert successfully.");
}catch(Exception ex)
{
Console.WriteLine("Error:"+ex.Message);
}
}
同样我们不需要使用save方法进行更新到数据库的操作,注意jrsc是数据中collection对应的名称。
3)批量插入
在关系型数据库中,我们可以使用针对批量的数据进行更新到数据库,对象数据库同样支持。
private static void BatchInsert()
{
List pl = new Data().GetPersonList();
try{
MongoClient mc = new MongoClient(strconn);
MongoServer server = mc.GetServer();
MongoDatabase db = server.GetDatabase(dbName);
MongoCollection PersOns=
db.GetCollection("jrsc");
BsonDocument[] batch = new BsonDocument[pl.Count];
for (int i = 0; i
{
batch[i] = new BsonDocument { { "P_ID", pl[i].P_ID.ToString()}, {
"P_NAME", pl[i].P_NAME.ToString()}};
}
Persons.InsertBatch(batch);
Console.WriteLine("BatchInsert successfully.");
}
catch(Exception ex){
Console.Write("Error:"+ex.Message);
}
}
唯一需要注意的是BsonDocument的格式写法。
4)数据查询操作
数据查询操作有单一记录查找和全部查找。
public static void Query()
{
try {
MongoClient mc = new MongoClient(strconn);
MongoServer server = mc.GetServer();
MongoDatabase db = server.GetDatabase(dbName);
MongoCollection PersOns=
db.GetCollection("jrsc");
var query = new QueryDocument("name","li jing");
foreach (BsonDocument p in Persons.Find(query))
{
Console.WriteLine("name"+p["name"]+",age:"+p["age"]);
}
Console.WriteLine("Mongo Query successfully.");
}catch(Exception ex)
{
Console.WriteLine("Error:"+ex.Message);
}
}
数据查询的结果可以直接给游标,通过游标进行处理,这里就不详细讲。
5)数据更新
private static void Update()
{
try
{
MongoClient mc = new MongoClient(strconn);
MongoServer server = mc.GetServer();
MongoDatabase db = server.GetDatabase(dbName);
MongoCollection PersOns=
db.GetCollection("jrsc");
var query1 = new QueryDocument("name", "li jing");
foreach (BsonDocument p in Persons.Find(query1))
{
Console.WriteLine("您希望"+ p["name"] + "几岁?");
p["age"] = Console.ReadLine();
Persons.Save(p);
}
var query2 = new QueryDocument("name", "li jing");
foreach (BsonDocument p in Persons.Find(query2))
{
Console.WriteLine("id"+p["_id"]+"name:"+p["name"]+",age:"+p["age"]);
}
Console.WriteLine("Mongo Query successfully.");
}
catch (MongoQueryException ex)
{
Console.WriteLine("Error:" + ex.Message);
}
}
数据更新只需要对值进行重新赋值,并且需要调用save方法即可。
基本操作到这里介绍结束,打完收工!