0

/year/month/dayタイプ URLを使用するようにブログを変換する作業を行っています。しかし、私はコンセプトに関してかなり悪い問題に遭遇しました。時間/分単位の解像度のみにしたいのですが、もちろん、すべてのエントリは可能な限りフルタイムで保存されます (それを変更したくありません)。

MongoDB で特定の日付を特定性の低い日付に解決するにはどうすればよいですか? 10gen の .Net 用の公式 MongoDB マッパーを使用しています。

私のデータモデルは次のようになります:

public class BlogEntryData
{
    [BsonId]
    public ObjectId ID;
    public string Title;
    public string Text;
    public DateTime Posted;
    public DateTime Edited;
    public List<string> Tags;
    [BsonDefaultValue(true)]
    public bool Publish;
}

を使用してブログのエントリを取得します

var c=Config.GetDB().GetCollection<BlogEntryData>("entries");
BlogEntryData entry;
try
{
    entry=c.FindOneByIdAs<BlogEntryData>(new ObjectId(RouteParams["id"]));
}
catch
{
    throw new HttpException(404,"Blog entry not found");
}

if(entry==null)
{
    throw new HttpException(404,"Blog entry not found");
}

数値検索フィールドなどのIDの代わりに使用するように変更する方法は知っていますが、日付に対してクエリを実行したことはありません。

あと、余談ですがエントリーモデルに非正規化した「URLの日付」を文字列として格納した方が良いのでしょうか?インデックスが日付などで適切に機能しなかった場合にのみ、これを行いたいと思います

4

2 に答える 2

2

DateTimes は、次の構文を使用して Mongo で表すことができます。

ISODate("2012-10-11T17:33:51.994Z")

これは、正規のソート可能な形式です。したがって、年、月、日、時間などで始まり、最も具体的な順序になっています。これでできることがいくつかあります。

  1. 文字列の最初の部分を使用するだけで、文字列の解析を行うことができます。しかし、それはあまりにも賢明ではありません。
  2. ISODate()に加えて、年と月を個別のフィールドとして単純に複製できます。ここでの利点は、これらのフィールドを直接参照でき、具体的にインデックスを作成できることです。
  3. 最後に、範囲を使用して検索することができます。

db.so.find({Posted:{$gt: ISODate("2012-10-11"), $lt:ISODate("2012-10-12")}})

1 はまったくお勧めしませんが、2 と 3 は非常にうまく機能します。

ちなみに、これらのメカニズムは両方とも C# ドライバーにうまく変換されます。したがって、より完全な答えとして;

        var dayOfInterest = new DateTime(2012, 10, 11);
        var rangeOfInterest = dayOfInterest.AddDays(1);

// ...

         var entries = c.FindAs<BlogEntryData>(Query.And(
                                    Query.GT("Posted", dayOfInterest),
                                    Query.LT("Posted", rangeOfInterest)
                         ));
于 2012-10-11T23:06:23.673 に答える
0

始める前に、あなたの質問を正しく理解していることを確認させてください。現在、日付を日付/時刻形式で保存していますが、より細かい方法で日付を使用およびクエリできるようにしたいと考えています。これが疑問に思っていることであれば、朗報があります。mongodDB では、これらすべてが非常に単純です。

まず最初に、このトピックに関する mongodb のクックブックの投稿を読んで、mongodb内の日付に対してクエリを実行し、インデックスを作成する方法を学習する必要があります。

第二に、C# で日付を取得したら、それは (いくつかの検索で確認しようとしましたが、まだ 100% 確実ではありません) c# DateTime クラスにあります。このクラスには、さまざまな粒度で日付を表示するために使用できるかなりの数のメソッドがあります。この件名の詳細については、Microsoft のドキュメントを参照してください。

うまくいけば、これがあなたの質問に答え、mongodbを楽しみ続けるために必要なツールを提供します

于 2012-10-11T17:37:31.390 に答える