class Program
{
const string CollectionName = "video";
static void Main(string[] args)
{
// remove the demo collection then recreate later
db.GetCollection<Video>(CollectionName).Database.DropCollection(CollectionName);
var videos = new List<Video>
{
new Video { Title="The Perfect Developer",
Category="SciFi", Minutes=118 },
new Video { Title="Lost In Frankfurt am Main",
Category="Horror", Minutes=122 },
new Video { Title="The Infinite Standup",
Category="Horror", Minutes=341 }
};
Console.WriteLine("Insert Videos ...");
db.GetCollection<Video>(CollectionName).InsertMany(videos);
Console.WriteLine("[After insert] All Videos : ");
var all = db.GetCollection<Video>(CollectionName).Find(x=>x.Title != string.Empty).ToList();
foreach (var v in all)
{
Console.WriteLine(v);
}
Console.WriteLine("Group By...");
var groupby = db.GetCollection<Video>(CollectionName).Aggregate()
.Group(x => x.Category, g => new {Name = g.Key, Count = g.Count(), TotalMinutes = g.Sum(x => x.Minutes)})
.ToList();
foreach (var v in groupby)
{
Console.WriteLine(v.Name + "," + v.Count + "," + v.TotalMinutes);
}
Console.WriteLine("Updating One [Title = The Perfect Developer]...");
// updating title with "The perfect developer" video's 'title' and 'minute'
db.GetCollection<Video>(CollectionName).FindOneAndUpdate(x=>x.Title == "The Perfect Developer",
Builders<Video>.Update.Set(x=> x.Title , "A Perfect Developer [updated]")
.AddToSet(x => x.Comments, "good video!")
.AddToSet(x => x.Comments, "not bad"));
Console.WriteLine("[After Updating One] All Videos : ");
all = db.GetCollection<Video>(CollectionName).Find(x => x.Title != string.Empty).ToList();
foreach (var v in all)
{
Console.WriteLine(v);
}
Console.WriteLine("Deleting One... [Minutes = 122]");
db.GetCollection<Video>(CollectionName).DeleteOne(x => x.Minutes == 122);
Console.WriteLine("[After Deleting One] All Videos : ");
all = db.GetCollection<Video>(CollectionName).Find(x => x.Title != string.Empty).ToList();
foreach (var v in all)
{
Console.WriteLine(v);
}
Console.Read();
}
private static IMongoDatabase db
{
get
{
var url = new MongoUrl(ConfigurationSettings.AppSettings["mongoUrl"]);
var client = new MongoClient(url);
return client.GetDatabase(url.DatabaseName);
}
}
}
[BsonIgnoreExtraElements]
public class Video
{
public Video()
{
Comments = new List<string>();
}
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Title { get; set; }
public string Category { get; set; }
public int Minutes { get; set; }
public IList<string> Comments { get; set; }
public override string ToString()
{
return string.Format("{0} - {1} - {2}", Title, Category, Minutes);
}
}
对于mongoDB C# driver从1.9到2.0的更新,简化了数据库的连接方式,简化了Find,Update,Delete的接口,group by和projection操作也更流畅了。
在Builders<T>中整合了 update, filter, projection, 和sort,功能的内聚性更强了,找function很方便。