读书人

MongoDB学习札记三一C#操作数据库

发布时间: 2012-07-22 19:31:15 作者: rapoo

MongoDB学习笔记三一C#操作数据库
目标:向数据库插入两条Notes,一个包含标签一个没有,然后通过Update给不包含标签的Notes添加标签

为了完成我们的目标,首先我们的到http://github.com/samus/mongodb-csharp 下载Mongodb的c#驱动,解压缩并打开Visual Studio解决方案,然后编译得到两个DLL的:MongoDB.Driver.dll、MongoDB.Linq.dll 。我们用json.net来实现序列化和反序列化,您可以从这里下载 。

接着我们用vs2010创建一个简单的控制台应用程序,这里提供三种用C#操作MongoDB的方法:1.使用JSON 2.使用序列化/反序列化的Json.Net 3.使用动态代理

一、这里我们创建一个帮助类(MongoJson.cs)来实现数据库Document和C# 实体类之间的映射:

using System.Collections.Generic;
using System.Linq;
using MongoDB.Driver;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Pls.MdbIntro
{
public class MongoJson
{
private const string _oidContainerName = "_id";

public T ObjectFrom<T>(Document document)
where T : class, IMongoEntity
{
if (document == null)
return null;

return JsonConvert.DeserializeObject<T>(document.ToString());
}

public Document DocumentFrom(string json)
{
return PopulateDocumentFrom(new Document(), json);
}

public Document DocumentFrom<T>(T item)
where T : class, IMongoEntity
{
return PopulateDocumentFrom(new Document(), item);
}

public Document PopulateDocumentFrom<T>(Document document, T item)
where T : class, IMongoEntity
{
if (item == null)
return document;

var json = JsonConvert.SerializeObject(item, Formatting.None);

return PopulateDocumentFrom(document, json);
}

private Document PopulateDocumentFrom(Document document, string json)
{
var keyValues = JsonConvert.DeserializeObject<Dictionary<string, object>>(json);

foreach (var keyValue in keyValues)
{
var isEmptyKeyField = (
keyValue.Key == _oidContainerName && document[_oidContainerName] != MongoDBNull.Value);

if (isEmptyKeyField)
continue;

var value = keyValue.Value ?? MongoDBNull.Value;

if (value != MongoDBNull.Value)
{
var arrayValue = (keyValue.Value as JArray);
if (arrayValue != null)
value = arrayValue.Select(j => (string)j).ToArray();
}

if (document.Contains(keyValue.Key))
document[keyValue.Key] = value;
else
{
if (value != MongoDBNull.Value)
document.Add(keyValue.Key, value);
}
}

return document;
}
}
}

二、创建Note实体类

public interface IMongoEntity
{
string _id { get; set; }
Oid GetOid();

Document GetAsDocument();
void UpdateFromDocument(Document document);
}



[Serializable]
public class Note
: IMongoEntity
{
public virtual string _id { get; set; }
public virtual string Title { get; set; }
public virtual string Body { get; set; }
public virtual string[] Tags { get; set; }

public virtual Oid GetOid()
{
return new Oid(_id);
}

public virtual Document GetAsDocument()
{
throw new NotImplementedException();
}

public virtual void UpdateFromDocument(Document document)
{
throw new NotImplementedException();
}
}

三、编写测试代码

var json = new MongoJson();
var mongo = new Mongo();

mongo.Connect();


var db = mongo["SimpleNotes"];
db.SendCommand("dropDatabase");
var notes = db["Notes"];

PrintNotes("Initial notes", notes);

//创建一个包含Tags的Note
var firstNoteDocument = json.DocumentFrom("{Title : \"First note using Json.\", Body : \"Some nice text.\", Tags : [\"MongoDB\", \"Getting started\"]}");
notes.Insert(firstNoteDocument);



//创建不包含Tags的Note
var secondNoteDocument = json.DocumentFrom("{Title : \"Second note using Json.\", Body : \"Some nice text.\"}");
notes.Insert(secondNoteDocument);



//查询Tags为空的Note并更新添加Tags
var noteDocument = notes.FindOne(new Document { { "Tags", MongoDBNull.Value } });
noteDocument.Update(json.DocumentFrom("{Tags : [\"The tag\"]}"));

notes.Update(noteDocument);



mongo.Disconnect();


读书人网 >其他数据库

热点推荐