操纵虚拟数据与数据库数据之间的不一致性

时间:2014-01-08 12:06:04

标签: javascript node.js mongodb mongoose underscore.js

我正在学习Node.js / Express,并且遇到了一个非常奇怪的问题。我觉得可能对复制数组/对象有一个错误的理解,所以我会感激任何评论,因为虽然我已经读过这个问题但我很难过。

我编写了两个函数,它们基本上采用数组,操作它并返回更改后的数组以便进一步处理/转发到客户端。代码位于https://gist.github.com/grabbeh/8314291,但一般意图可表示如下:

按预期使用客户端提供的更新数据

exports.test = function(req, res){
   returnDummyData(function(data){
        transformData(data, function(data){
             res.json(data);
        });
    });
 }     

客户端以非转换状态显示的原始数据

exports.test = function(req, res){
   returnDBData(function(data){
        transformData(data, function(data){
             res.json(data);
        });
    });
 }      

我调查了问题,并使用虚拟数据来检查js文件中定义的函数。使用此数据时,它由各种函数操作(首先为每个对象添加一个排名属性,然后添加countryRanking属性),然后使用res.json发送到客户端,并以更改的形式显示。

但是,当我使用Mongoose从MongoDB数据库中提取这些数据并通过相同的函数运行它时,当数据被发送到服务器时,它会以未经处理的形式发送,原因我无法理解。 Stranger仍然(至少对我来说),直接通过console.log访问时会显示被操作的表单,但是当整个对象通过console.log显示时,将显示未修改的对象,如下例所示:

有问题的功能

Photo.find({ country:'RUS', tag: 'cat', isVoted: true}, function(err, data){
    calculatePhotoRanking(data, function(data){
        calculateCountryRankings(data, function(data){
            // displayed object does not show ranking or countryRanking properties
            console.log(data[0])
            // however this does display the calculated countryRanking
            console.log(data[0].countryRanking)
            res.json(data)
        });     
    });
})

我很困惑,坦率地说这是怎么回事。我认为这可能是因为在调用时通过函数时没有改变'data'的命名,但是改为'data','dataTwo','dataThree'没有区别。

1 个答案:

答案 0 :(得分:1)

如果要将Mongoose文档作为纯JavaScript对象而不是模型实例进行访问和操作,可以在查询链中包含lean()

Photo.find({country:'RUS', tag: 'cat', isVoted: true}).lean().exec(
    function(err, data) {
        calculatePhotoRanking(data, function(data) {
            ...