首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在谷歌的Civil.Date包MongoDB中使用过滤器查询?

如何在谷歌的Civil.Date包MongoDB中使用过滤器查询?
EN

Stack Overflow用户
提问于 2022-10-31 17:57:35
回答 2查看 16关注 0票数 0

谷歌的civil包很简单--它的目标是代表一年中的一天,而不考虑时间和地点。这对于像生日一样的事情是有用的,在世界各地都是一样的--尽管世界各地的时间都不同。

主要结构是:

代码语言:javascript
复制
type Date struct {
    Year  int        // Year (e.g., 2014).
    Month time.Month // Month of the year (January = 1, ...).
    Day   int        // Day of the month, starting at 1.
}

它在MongoDB中被表示为一个具有3个整数值的对象:

代码语言:javascript
复制
# golang definition
occurredOn civil.Date `bson:"occurredOn"`
...

# mongodb definition
occurredOn Object
year       2022
month      4
day        2

如果你想质疑的话,这会导致你的古怪。例如,我不认为标准的$gt / $lt查询能够工作,因为2022-4-2在字典上比2022-10-20大,但它是一个较早的日期,我相信mongoDB可以为比较彼此的对象做一个最好的场景,但这也增加了查询的内部复杂性。本质上,它比比较两个time.Time实例之间的比较要复杂得多。那么最简单的方法是什么呢?

EN

回答 2

Stack Overflow用户

发布于 2022-10-31 17:57:35

据我所知,有四种边缘情况需要处理:

year/month/day

  • 同日而异年
  • 同日,但不同月份
  • 同日,但不同日
  • 某些组合不同的

下面是我想出的函数,它返回一个mongoDB查询来检查一个严格大于另一个civil.Datecivil.Date。对于这种奇怪的格式设置表示歉意,但这正是go fmt所指出的:

代码语言:javascript
复制
func occurredOnGTQueryTest(date civil.Date) bson.M {
    return bson.M{"$or": bson.A{
        bson.M{"occurredOn.year": bson.M{"$gt": date.Year}}, // happens in the next year

        bson.M{"occurredOn.year": bson.M{"$gte": date.Year},
            "occurredOn.month": bson.M{"$gt": date.Month}}, // happens in the next month

        bson.M{"occurredOn.year": bson.M{"$gte": date.Year},
            "occurredOn.month": bson.M{"$gte": date.Month},
            "occurredOn.day":   bson.M{"$gt": date.Day}}, // happens in the next day
    },
    }
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-01 19:33:51

我认为在mongo中没有序列化类型civil.Date的实现。(没有函数MarshalBinary)

也许,为了更好的解决方案,必须将它更改为time.Time包,因为它在任何序列化(如bson、json或xml )中,甚至在google中都有实现。

但是,如果civil.Date的类型是所需的类型,那么您应该逐个查询和比较字段,范围从年份、月份和日数不等。您必须考虑更新或修改集合的索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74267352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档