javascript - 以一致的格式显示文档数组的数据

标签 javascript mongodb mongodb-query aggregation-framework

我有一个包含一系列文件的个人邮箱

{ "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/

相关文章:

node.js - 使用 mongoose 驱动程序的 MongoDB : how to query on a subset of document's array property?

javascript - 图像跟随鼠标,使用mousemove事件(使用Jquery/Javascript)

javascript - 如何仅在另一个函数完成后才执行另一个函数?

javascript - 如何使用 ReactJS、Redux 和 ES2015 将 onChange 回调正确绑定(bind)到 'this'?

javascript - Meteor - 发布按个性化分数排序的集合

node.js - 在 mongodb 中 $facet 聚合后格式化数据

javascript - 检测浏览器缩放级别

Mongodb Schema考虑子文档以避免多次读取

mongodb - 当 lambda 容器过期时,有没有好的方法来关闭 mongo 连接?

javascript - 从数组 MongoDB 中删除对象