映射中的Object.assign返回意外的响应,并附带其他信息

时间:2019-07-02 14:52:48

标签: javascript node.js mongodb

我试图用我计算出的新值系统地替换JSON对象中的键值:

newReport = filteredReport

  sumFunc = (items, prop) => {
       return items.reduce( function(a, b){
              return a + b[prop];
     }, 0);
 }

 complete = newReport.map((v,i) => {
    let newValue = sumFunc(newReport[i].like, 'value')  
    //return { ...v, like: newValue } 
    return Object.assign({}, v, {like: newValue})

 })

filteredReport,即原始值,是来自MongoDB的查询结果。

运行此函数时,得到的响应长为340,000行。正确的结果位于最后一行,但是在那里我得到了很多其他意外信息。

为什么我会收到此信息?

这是响应的示例:https://codepen.io/schoenbl/pen/pXVRBq?editors=0010#0

编辑: 当我使用spread和Object.assign时,会收到相同的结果。

另一个编辑: 当我在外面预览时,它可以正常工作: https://playcode.io/360520?tabs=script.js,preview,console

最后修改: 这是我的mongo查询:

const report = await Report.find({createdAt: { $gt: startDate, $lt: Date() }})
    .populate({path: 'like'})
    .populate({
        path: 'player',
        populate: [{ path: 'team' },
        {
            path: 'team',
            populate: {
                path: 'league'
            }
        }
    ]
})

1 个答案:

答案 0 :(得分:2)

查询时,它返回一个数组Mongoose文档实例。但是,当您使用控制台日志时,它会向您显示其toString表示形式。但是实际上,它包含Document类实例的所有那些函数属性,以进行进一步的操作。要仅返回数据,请在查询时使用.lean()

Report.find().lean().exec(function (err, report) {
    ....
}

这将仅返回所需数据的普通js对象。并非所有的类属性和方法。

提示:要知道变量真正包含的内容,请使用console.dir而不是console.log