Как получить Min и Max DateTime из MongoDB с помощью запросов C #? - PullRequest
0 голосов
/ 27 декабря 2011

Я написал запрос для Сортировки и MAX и MIN записей DateTime с использованием запросов MongoDB c #.я написал как

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, toDt в Textboxes.Но я получил ошибку, так как не могу преобразовать строку в DateTime.

1 Ответ

6 голосов
/ 27 декабря 2011

Я предполагаю, что ваш вопрос можно перефразировать следующим образом:

  1. У меня есть коллекция, где у некоторых документов есть поле ввода, а у некоторых нет
  2. Я хочу найти наименьшее и наибольшее значения, присутствующие в коллекции для тех документов, которые действительно имеют значение для поля ввода.

Часто лучше сначала разобраться в оболочке MongoDB, а затем перевести на 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

...