2011-12-27 103 views
-3

我使用MongoDB c#查询编写了对SortTime和MAX和MIN记录的DateTime查询。 我写的如何使用c#查询从MongoDB获取最小和最大日期时间?

var server = MongoServer.Create(this.connectionString); 
var db = server.GetDatabase(DATABASE); 
var tblRskAlerts = db.GetCollection(RISKALERT_TBL); 
var query = Query.And(Query.EQ("Entry", null)); 
var sort = tblRskAlerts.Find(query).SetSortOrder(SortBy.Ascending("Entry")); 
var sort =SortBy.Ascending("Entry"); 
var fromDt = sort.Max(x => x["Entry"].ToJson()); 
var toDt = sort.Min(x => x["Entry"].ToJson()); 
txtToCal.Text = ((DateTime)toDt).ToLocalTime(); 

现在我想fromDt,托德显示为文本框。 但我得到错误,因为无法将字符串转换为DateTime。

+0

MB您寻找[DateTime.Parse(http://msdn.microsoft.com /en-us/library/1k1skd40.aspx)方法?你的问题不是很清楚...... –

回答

6

我猜,如下你的问题可以改写:

  1. 我有一个集合,其中一些文件有一个输入字段和一些不
  2. 我想找到的最小和最大对于那些实际上具有Entry字段值的文档,集合中存在的值。

通常情况下,最好先在MongoDB shell中弄清楚事情,然后在完成实验后转换为C#。

下壳语句创建一些示例数据:

> db.test.remove() 
> db.test.insert({}) 
> db.test.insert({Entry:ISODate("2011-12-01")}) 
> db.test.insert({Entry:ISODate("2011-12-02")}) 
> db.test.insert({Entry:ISODate("2011-12-03")}) 

这是个什么文件刚刚插入的样子:

> db.test.find() 
{ "_id" : ObjectId("4efa1208a981bdd43ddcacd0") } 
{ "_id" : ObjectId("4efa1215a981bdd43ddcacd1"), "Entry" : ISODate("2011-12-01T00:00:00Z") } 
{ "_id" : ObjectId("4efa1218a981bdd43ddcacd2"), "Entry" : ISODate("2011-12-02T00:00:00Z") } 
{ "_id" : ObjectId("4efa121ba981bdd43ddcacd3"), "Entry" : ISODate("2011-12-03T00:00:00Z") } 

注意,其中一人没有输入字段。我们可以从使用$结果中排除它存在的查询:

> db.test.find({Entry:{$exists:true}}) 
{ "_id" : ObjectId("4efa1215a981bdd43ddcacd1"), "Entry" : ISODate("2011-12-01T00:00:00Z") } 
{ "_id" : ObjectId("4efa1218a981bdd43ddcacd2"), "Entry" : ISODate("2011-12-02T00:00:00Z") } 
{ "_id" : ObjectId("4efa121ba981bdd43ddcacd3"), "Entry" : ISODate("2011-12-03T00:00:00Z") } 

我们找到包含我们可以在最小和最大值排两次,一次上升和一次下降的文件,并将结果限制在一个文档:

> db.test.find({Entry:{$exists:true}}).sort({Entry:1}).limit(1) 
{ "_id" : ObjectId("4efa1215a981bdd43ddcacd1"), "Entry" : ISODate("2011-12-01T00:00:00Z") } 
> db.test.find({Entry:{$exists:true}}).sort({Entry:-1}).limit(1) 
{ "_id" : ObjectId("4efa121ba981bdd43ddcacd3"), "Entry" : ISODate("2011-12-03T00:00:00Z") } 

然后它只是从文档中提取Entry值的问题。

下面是它看起来像在C#代码:

var server = MongoServer.Create("mongodb://localhost/?safe=true"); 
var database = server["test"]; 
var collection = database["test"]; 
collection.Drop(); 

collection.Insert(new BsonDocument()); 
collection.Insert(new BsonDocument("Entry", new DateTime(2011, 12, 1, 0, 0, 0, DateTimeKind.Utc))); 
collection.Insert(new BsonDocument("Entry", new DateTime(2011, 12, 2, 0, 0, 0, DateTimeKind.Utc))); 
collection.Insert(new BsonDocument("Entry", new DateTime(2011, 12, 3, 0, 0, 0, DateTimeKind.Utc))); 

var query = Query.Exists("Entry", true); 
var sortAscending = SortBy.Ascending("Entry"); 
var sortDescending = SortBy.Descending("Entry"); 

foreach (var document in collection.Find(query).SetSortOrder(sortAscending)) 
{ 
    Console.WriteLine(document.ToJson()); 
} 
Console.WriteLine(); 

var minDocument = collection.Find(query).SetSortOrder(sortAscending).SetLimit(1).First(); 
var maxDocument = collection.Find(query).SetSortOrder(sortDescending).SetLimit(1).First(); 

var minDateTime = minDocument["Entry"].AsDateTime; 
var maxDateTime = maxDocument["Entry"].AsDateTime; 

Console.WriteLine("Min Entry = {0}", minDateTime.ToString("o")); 
Console.WriteLine("Max Entry = {0}", maxDateTime.ToString("o")); 

完整的测试程序是:http://www.pastie.org/3080660

+0

我应该补充说明,为了使这种方法对大型集合有效,你需要在Entry上创建一个索引。 –

相关问题