我有一个包含一系列文件的个人邮箱
{ "Name" : "A", "Email" : [ { "EmailAddress" : "a@home.com", "EmailType" : "Home" }, { "EmailAddress" : "a@work.com", "EmailType" : "Work" } ] }
{ "Name" : "B", "Email" : [ { "EmailAddress" : "b@work.com", "EmailType" : "Work" } ] }
{ "Name" : "C" }
我必须以下面的格式显示数据,即如果我们一个人没有家庭/工作地址,如果家庭或工作电子邮件不可用,最好以相同的顺序显示为“无数据”(首先是家庭电子邮件, 工作邮箱其次)
{ "Name" : "A", "Email" : [ { "EmailAddress" : "a@home.com", "EmailType" : "Home" }, { "EmailAddress" : "a@work.com", "EmailType" : "Work" } ] }
{ "Name" : "B", "Email" : [ { "EmailAddress" : "No Data", "EmailType" : "Home" }, { "EmailAddress" : "b@work.com", "EmailType" : "Work" } ] }
{ "Name" : "C", "Email" : [ { "EmailAddress" : "No Data", "EmailType" : "Home" }, { "EmailAddress" : "No Data", "EmailType" : "Work" } ] }
我想用 $unwind 或 $switch 函数来实现它。请提出建议
最佳答案
有可能:
db.collection.aggregate([
{ "$project": {
"Name": 1,
"Email": {
"$map": {
"input": ["Home", "Work"],
"as": "m",
"in": {
"$ifNull": [
{ "$arrayElemAt": [
{ "$filter": {
"input": "$Email",
"as": "e",
"cond": { "$eq": [ "$$e.EmailType", "$$m" ] }
}},
0
]},
{ "EmailAddress": "No Data", "EmailType": "$$m" }
]
}
}
}
}}
])
产生:
{
"_id" : ObjectId("591e7d66cb1a9433dab779cc"),
"Name" : "A",
"Email" : [
{
"EmailAddress" : "a@home.com",
"EmailType" : "Home"
},
{
"EmailAddress" : "a@work.com",
"EmailType" : "Work"
}
]
}
{
"_id" : ObjectId("591e7d66cb1a9433dab779cd"),
"Name" : "B",
"Email" : [
{
"EmailAddress" : "No Data",
"EmailType" : "Home"
},
{
"EmailAddress" : "b@work.com",
"EmailType" : "Work"
}
]
}
{
"_id" : ObjectId("591e7d66cb1a9433dab779ce"),
"Name" : "C",
"Email" : [
{
"EmailAddress" : "No Data",
"EmailType" : "Home"
},
{
"EmailAddress" : "No Data",
"EmailType" : "Work"
}
]
}
但就我个人而言,我会在客户端代码中进行这种转换,因为它不那么迟钝。作为一个快速的 shell 示例:
db.collection.find().forEach(doc => {
doc.Email = ["Home", "Work"].map( m => {
if (!doc.hasOwnProperty('Email'))
doc.Email = [];
var val = doc.Email.filter(e => e.EmailType === m)[0];
return (val == null) ? { "EmailAddress": "No Data", "EmailType": m }
: val;
});
printjson(doc);
})
基本上,虽然您使用“家庭”和“工作”的“统一”数组作为 $map
的来源,然后在当前 Email
文档中查找元素大批。在查找时返回 null
的任何内容都将与默认数据交换。
关于javascript - 以一致的格式显示文档数组的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44061717/