我有这种形式的MongoDB文档,其中“疫苗接种”是一组ISODates:
{
"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”字段,因为它们是“疫苗” BSON数组的一部分。
有人对将ISODate文档转换为所需文档有任何建议/解决方案吗?
谢谢
答案 0 :(得分:1)
您可以使用$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"
}
}
}
]
}
}
}
}
}]);
编辑:更正后的输出
希望这会有所帮助!