谷歌的civil包很简单--它的目标是代表一年中的一天,而不考虑时间和地点。这对于像生日一样的事情是有用的,在世界各地都是一样的--尽管世界各地的时间都不同。
主要结构是:
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个整数值的对象:
# 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实例之间的比较要复杂得多。那么最简单的方法是什么呢?
发布于 2022-10-31 17:57:35
据我所知,有四种边缘情况需要处理:
year/month/day
下面是我想出的函数,它返回一个mongoDB查询来检查一个严格大于另一个civil.Date的civil.Date。对于这种奇怪的格式设置表示歉意,但这正是go fmt所指出的:
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
},
}
}发布于 2022-11-01 19:33:51
我认为在mongo中没有序列化类型civil.Date的实现。(没有函数MarshalBinary)
也许,为了更好的解决方案,必须将它更改为time.Time包,因为它在任何序列化(如bson、json或xml )中,甚至在google中都有实现。
但是,如果civil.Date的类型是所需的类型,那么您应该逐个查询和比较字段,范围从年份、月份和日数不等。您必须考虑更新或修改集合的索引。
https://stackoverflow.com/questions/74267352
复制相似问题