Как проанализировать расширенную дату JSON в конвейере агрегации, используя ParseExtJSONArray () в mongo-go-driver - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть коллекция с полем Date:

{
    "_id" : ObjectId("5b92b359ddceef5b24502834"),
    "dateTimeGMT" : ISODate("2018-08-22T09:29:25.000Z"),
    yada, yada, yada
}

Я пытаюсь найти по дате на этапе агрегации $ match с помощью функции ParseExtJSONArray mongo-go-driver.(Я знаю, как сделать это с * bson.Array напрямую. Я спрашиваю, чтобы я знал, как правильно сделать это с ParserExtJSONArray или если я столкнулся с ограничением.)

IУпростил этот пример и подтвердил, что он не соответствует приведенному выше документу.

pipeline, err := bson.ParseExtJSONArray(`[
    { "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
]`)
cursor, err := receivedFromResponseQueue.Aggregate(ctx, pipeline)

Следующее не работает в оболочке mongo.(Не удивительно, потому что он автоматически конвертируется в формат ISODate ())

db.getCollection('received_from_response_queue').aggregate([
    { "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }
])

Но это работает в оболочке mongo.

db.getCollection('received_from_response_queue').aggregate([
    { "$match": { "dateTimeGMT": ISODate("2018-08-22T09:29:25.000Z") } }
])

Но это возвращает пустой массив в "pipe",(Поскольку ParseExtJSONArray не обрабатывает JavaScript)

pipeline, err := bson.ParseExtJSONArray(`[
    { "$match": { "dateTimeGMT":ISODate("2018-08-22T09:29:25.000Z") } }
]`)

Поскольку он затем использует пустой массив, он перенастраивает все документы в коллекции.Интересно, что в документе, который мы пытаемся сопоставить, дата форматируется по-разному.

{
    "_id" : { "$oid" : "5b92b359ddceef5b24502834" },
    "dateTimeGMT" : { "$date" : "2018-08-22T05:29:25-04:00" },
    yada yada yada
}

Но это тоже не совпадает.

pipeline, err := bson.ParseExtJSONArray(`[
    { "$match": { "dateTimeGMT.$date":"2018-08-22T05:29:25-04:00" } }
]`)
cursor, err := receivedFromResponseQueue.Aggregate(ctx, pipeline)

И это не работает вОболочка монго.

db.getCollection('received_from_response_queue').aggregate([
    { "$match": { "dateTimeGMT.$date":"2018-08-22T05:29:25-04:00" } }
])

Есть идеи?

1 Ответ

0 голосов
/ 12 сентября 2018

Идея MongoDB Extended JSON заключается в представлении двоичных типов JSON ( BSON ) в виде простого JSON.

Общий синтаксис состоит в представлении объекта в виде одного внедренного документа.Например, объект BSON binary представлен в виде документа {"$binary": "<binary data>"}.Префикс $ в ключевом поле указывает тип.То же самое относится к объекту BSON date .

Метод bson.ParseExtJSONArray () ожидает, что расширенные типы JSON будут документами, а не в MongoDB dot-нотация выражение.Например, вместо ниже:

{ "$match": { "dateTimeGMT.$date":"2018-08-22T09:29:25.000Z" } }

Метод ожидает:

{ "$match": { "dateTimeGMT": {"$date":"2018-08-22T09:29:25.000Z" } } }

Вы также можете указать значение даты в Unix Epoch , например:

{ "$match": { "dateTimeGMT": {"$date": { "$numberLong": "1546300800"} } } }

Используя mongo-go-driver / bson , пример будет:

raw := `[ { "$match": {"dateTimeGMT": {"$date": {"$numberLong": "1530962624753" } } } } ]`
pipeline, err := bson.ParseExtJSONArray(raw)
cursor, err := collection.Aggregate(context.Background(), pipeline)

Дополнительное примечание: вы можете отлаживать ParseExtJSONArray() перед передачей полученного значения в агрегацию путем итерации по нему.Например:

toConvert := `[
   { "$lookup": {
        "from": "anotherCollection",
        "localField": "foreignKey",
        "foreignField": "_id",
        "as": "someField"
    }},
    { "$match": {"dateTimeGMT":{"$lt": {"$date": "2019-01-10T09:29:25.000Z" } } } }
]`
pipeline, err := bson.ParseExtJSONArray(toConvert)

it, err := bson.NewArrayIterator(pipeline)
for it.Next() {
    fmt.Println(it.Value().MutableDocument().ToExtJSON(true))
}

//Outputs : 
//   {"$lookup":{"from":"anotherCollection","localField":"foreignKey","foreignField":"_id","as":"someField"}}
//   {"$match":{"dateTimeGMT":{"$lt":{"$date":{"$numberLong":"1547112565000"}}}}}
//
...