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 而不是 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 回答