Преобразование документов MongoDB, содержащих массивы ISODate, в строки - PullRequest
0 голосов
/ 14 января 2019

У меня есть документы MongoDB этой формы, где "прививки" - это массив ISODate:

{        
        "vacNo" : 1,
        "claimantDetails" : {
                "forename" : "Fry",
                "surname" : "Gordon",
                "dateOfBirth" : ISODate("2000-12-31T00:00:00Z")
        },
        "vaccinations" : [
                {
                        "dateOfVaccination" : ISODate("2010-12-31T00:00:00Z"),
                        "Type" : "MMR"
                },
                {
                        "dateOfVaccination" : ISODate("2015-01-31T00:00:00Z"),
                        "Type" : "Flu"
                }
        ]
}

Мне нужно преобразовать все ISODate в строку, в том числе в массиве «Прививки» (оставив остальные поля как есть), как показано ниже:

{
        "vacNo" : 1,
        "claimantDetails" : {
                "forename" : "Fry",
                "surname" : "Gordon",
                "dateOfBirth" : "2000-12-31"
        },
        "vaccinations" : [
                {
                        "dateOfVaccination" : "2010-12-31",
                        "Type" : "MMR"
                },
                {
                        "dateOfVaccination" : "2015-01-31",
                        "Type" : "Flu"
                }
        ]
}

Я могу использовать $ dateToString, но только для полей, которые не являются частью массива, таких как:

db.claimTest.aggregate([{$project:{ _id:0, 
    "vacNo":1, 
    "claimantDetails.forename":1,
    "claimantDetails.surname":1,
    "claimantDetails.dateOfBirth":{ $dateToString:{format:"%Y-%m-%d", date:"$claimantDetails.dateOfBirth"}}}}]);

, который преобразует "claimantDetails.dateOfBirth" в строку, но я не могу преобразовать ни одно из полей "dateOfVaccination", поскольку они являются частью массива BSNA "вакцинации".

У кого-нибудь есть какие-либо предложения / решения, которые могут помочь преобразовать документ ISODate в необходимый документ?

Спасибо

1 Ответ

0 голосов
/ 14 января 2019

Вы можете использовать $map для изменения каждого элемента массива. С помощью $ map и $ mergeObjects , следующее является одним из решений,

db.claimTest.aggregate([{
    $project: {
        _id: 0,
        "vacNo": 1,
        "claimantDetails.forename": 1,
        "claimantDetails.surname": 1,
        "claimantDetails.dateOfBirth":{ $dateToString:{format:"%Y-%m-%d", date:"$claimantDetails.dateOfBirth"}},
        "vaccinations": {
            $map: {
                input: "$vaccinations",
                as: "v",
                in: {
                    $mergeObjects: [
                        '$$v',
                        {
                            dateOfVaccination: {
                                $dateToString: {
                                    format: "%Y-%m-%d",
                                    date: "$$v.dateOfVaccination"
                                }
                            }
                        }
                    ]
                }
            }
        }
    }
}]);

Редактировать: исправленный вывод

Надеюсь, это поможет!

...