如何将此响应更改为简单数组?

时间:2020-06-17 07:22:59

标签: node.js arrays mongodb collections

{
"success": true,
"message": "Result",
"data": [
    {
        "Here": [
           {
                "_id": "5ee97ee7f25d1c1482717bdf",
                "email": "test1@test.io",
                "profileImages": [],
                "username": "test1",
                "birthday": "2020-06-11T10:11:32.000Z",
                "phoneNumber": "+910000000000",
                "location": "Test Location",
                "firstName": "test1",
                "lastName": "test1",

            }
        ]
    },
    {
        "Here": [
           {
                "_id": "5ee97ef2f25d1c1482717be1",
                "email": "test2@test.io",
                "profileImages": [],
                "username": "test2",
                "birthday": "2020-06-11T10:11:32.000Z",
                "phoneNumber": "+910000000000",
                "location": "Test Location"
            }

        ]
    }
],

}

我期望的是

 {
"success": true,
"message": "Result",
data: [
       {
            "_id": "5ee97ee7f25d1c1482717bdf",
            "email": "test1@test.io",
            "profileImages": [],
            "username": "test1",
            "birthday": "2020-06-11T10:11:32.000Z",
            "phoneNumber": "+910000000000",
            "location": "Test Location",
            "firstName": "test1",
            "lastName": "test1"},
        {
            "_id": "5ee97ef2f25d1c1482717be1",
            "email": "test2@test.io",
            "profileImages": [],
            "username": "test2",
            "birthday": "2020-06-11T10:11:32.000Z",
            "phoneNumber": "+910000000000",
            "location": "Test Location"
        }
    ]

}

我正在为此查询使用的查询下面是在mongodb,lookup和project中使用聚合,这导致我做出了一些不希望的响应

db.collections.aggregate( [

            {
            $lookup: {
                from: 'users',
                as: 'Here',
                let: {
                    whoDid: '$whoDid'
                },
                pipeline: [
                    {
                        "$match": { "$expr": { "$eq": ["$_id", "$$whoDid"] } }
                    },
                    {
                                $project: {
                                _id: 1,
                                email: 1,
                                profileImages: 1,
                                username: 1,
                                birthday: 1,
                                phoneNumber: 1,
                                firstName: 1,
                                lastName: 1,
                                fullName: 1,

                                // age: {$year: "$birthday"} 
                                age: {
                                    $divide: [{ $subtract: [new Date(), "$birthday"] },
                                    (31558464000)]
                                }
                            }
                    }
                ],
            }

        },

            {
                $project:{
                    Here:1,
                    _id:0

                }
            }  ,   
        ])

谁做过表是我存储用户ID的集合之一,后来我使用查找来填充数据

{
"_id" : ObjectId("5ee988eb1aac0022e15dbb7b"),
"whoDid" : ObjectId("5ee97ef2f25d1c1482717be1"),
"toWhomDid" : ObjectId("5ee97ec0f25d1c1482717bdd"),
"modified_at" : ISODate("2020-06-17T03:07:23.217Z"),
"created_at" : ISODate("2020-06-17T03:07:23.217Z"),
"__v" : 0
}
{
"_id" : ObjectId("5ee988eb1aac0022e15dbb7c"),
"whoDid" : ObjectId("5ee97ec0f25d1c1482717bdd"),
"toWhomDid" : ObjectId("5ee97ef2f25d1c1482717be1"),
"modified_at" : ISODate("2020-06-17T03:07:23.220Z"),
"created_at" : ISODate("2020-06-17T03:07:23.220Z"),
"__v" : 0
}

有人能建议我更好的选择,以便让我有一个理想的休止符吗?

2 个答案:

答案 0 :(得分:0)

可以使用reduce方法:

obj.data = obj.data.reduce((a, c) => {
    a.push(...c.Here);
    return a;
}, [])

一个例子:

let obj = {
  "success": true,
  "message": "Result",
  "data": [      {
          "Here": [             {
                  "_id": "5ee97ee7f25d1c1482717bdf",                  "email": "test1@test.io",
                  "profileImages": [],                  "username": "test1",
                  "birthday": "2020-06-11T10:11:32.000Z",                  "phoneNumber": "+910000000000",                  "location": "Test Location",
                  "firstName": "test1",                  "lastName": "test1",
              }
          ]
      },
      {
          "Here": [             {
                  "_id": "5ee97ef2f25d1c1482717be1",
                  "email": "test2@test.io",
                  "profileImages": [],
                  "username": "test2",
                  "birthday": "2020-06-11T10:11:32.000Z",
                  "phoneNumber": "+910000000000",
                  "location": "Test Location"
              }
          ]
      }
  ]
};


obj.data = obj.data.reduce((a, c) => {
    a.push(...c.Here);
    return a;
}, [])
console.log(obj);

答案 1 :(得分:0)

将这些额外的步骤添加到您的聚合管道中:

{
  $unwind: "$Here"
},
{
  $replaceWith: "$Here"
}

MongoPlayground

注意:您可以将$project: { _id: 1, email: 1, ...替换为此:

{
  $addFields:{
    age: {
      $divide: [{ $subtract: [new Date(), "$birthday"] },(31558464000)]
    }
  }
}