Как найти и сравнить даты на официальном драйвере MongoDB Go? - PullRequest
0 голосов
/ 04 октября 2018

Я новичок в mongodb-go-driver, и я застрял.

У меня есть дата внутри структуры вроде:

type Email struct {
    Date        string            `json:"date"`
}

Даты на моем mongoDB и отображаются в моемstruct имеет значения типа "10.02.2008 11:55:20".

Я хочу найти в своей БД элементы, которые Date находятся после другой даты, я пытаюсь это сделать, но ответвсегда ноль.

initDate, _ := time.Parse("02012006", initialDate)
cursor, err := emails.Find(context.Background(), bson.NewDocument(bson.EC.SubDocumentFromElements("date", bson.EC.DateTime("$gt", initDate.Unix()))))

что я делаю не так?

1 Ответ

0 голосов
/ 09 октября 2018

Даты на моем mongoDB и в моей структуре имеют значения типа "02/10/2018 11:55:20".

Существует несколько способов, которыми вы могли быделать.Во-первых, как упоминалось в комментарии, это преобразование даты string в фактический формат даты.Смотрите также MongoDB Date .Хранение значений даты в правильном формате даты является рекомендуемым способом для производительности.

Если у вас есть документ:

{ "a": 1, "b": ISODate("2018-10-02T11:55:20Z") }

Используя mongo-go-driver (текущий v0.0.15), вы можете сделать следующее, чтобы найти и сравнить, используя дату:

initDate, err := time.Parse("02/01/2006 15:04:05", "01/10/2018 11:55:20")
filter := bson.VC.DocumentFromElements(
    bson.EC.SubDocumentFromElements(
        "b",
        bson.EC.Time("$gt", initDate),
    ),
)
cursor, err := collection.Find(context.Background(), filter)

Обратите внимание на значение макета в примере выше для time.Parse().Это должно соответствовать расположению строки / формату.

Альтернативным способом без преобразования значения является использование MongoDB Aggregation Pipeline .Вы можете использовать оператор $ dateFromString для преобразования даты string в дату, а затем использовать этап $ match для фильтрации по дате.

Например, предоставленные документы:

{ "a": 1, "b": "02/10/2018 11:55:20" }
{ "a": 2, "b": "04/10/2018 10:37:19" }

Вы можете попробовать:

// Add a new field called 'newdate' to store the converted date value
addFields := bson.VC.DocumentFromElements(
    bson.EC.SubDocumentFromElements(
        "$addFields",
        bson.EC.SubDocumentFromElements(
            "newdate",
            bson.EC.SubDocumentFromElements(
                "$dateFromString",
                bson.EC.String("dateString", "$b"),
                bson.EC.String("format", "%d/%m/%Y %H:%M:%S"),
            ),
        ),
    ),
)

initDate, err := time.Parse("02/01/2006 15:04:05", "02/10/2018 11:55:20")

// Filter the newly added field with the date
match := bson.VC.DocumentFromElements(
    bson.EC.SubDocumentFromElements(
        "$match",
        bson.EC.SubDocumentFromElements(
            "newdate",
            bson.EC.Time("$gt", initDate),
        ),
    ),
)
pipeline := bson.NewArray(addFields, match)

cursor, err := collection.Aggregate(context.Background(), pipeline)
...