使用_.each将动态属性添加到Mongoose结果

时间:2015-04-30 09:02:33

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

我想动态地为Mongoose结果的每个对象添加一个属性,但它不会按预期工作。

Font.find()
.exec(function (err, fonts) {

    if(err) return res.send(err);

    _.each(fonts, function(item, i) {
        item.joined_name = item.name + item.style.replace(/\s/g, '');
        console.log(item.joined_name); // works fine
    });

    res.send(fonts); // `joined_name` property is nonexistant
});

必须简单,但我无法弄清楚原因。欢迎替代方案!

1 个答案:

答案 0 :(得分:2)

Mongoose documents 不允许添加属性。您需要在 Font.find().lean().exec(function (err, docs) { docs[0] instanceof mongoose.Document // false }); 之前调用lean()方法,因为启用了精益选项的查询返回的文档是普通的javascript对象。

来自文档:

Font.find()
    .lean()
    .exec(function (err, fonts) {
        if(err) return res.send(err);

        _.each(fonts, function(item, i) {
            item.joined_name = item.name + item.style.replace(/\s/g, '');
            console.log(item.joined_name); // works fine
        });

        res.send(fonts);  
    });

所以你的代码应该是这样的:

Font.find()
    .exec(function (err, docs) {
        if(err) return res.send(err);
        var fonts = [];
        _.each(docs, function(item, i) {
            var obj = item.toObject();
            obj.joined_name = obj.name + obj.style.replace(/\s/g, '');
            console.log(obj.joined_name); 
            fonts.push(obj);
        });

        res.send(fonts); 
    });

或将返回的文档强制转换为普通对象:

Uncaught TypeError: $(...).datetimepicker is not a function