1

我想要一个从另一个模型中的值总和派生的用户设置(在用户模型中)。

我试图做的是使用这样的查询创建一个虚拟值:

var schemaOptions = {
    toObject: {
        virtuals: true
    }
    ,toJSON: {
        virtuals: true
    }
};
/**
 * User Schema
 */

var UserSchema = new Schema({
  firstname: String,
  lastname: String,
  email: String,
  username: String,
  provider: String,
  phonenumber: Number,
  country: String,
  emailverificationcode: {type:String, default:'verifyme'},
  phoneverificationcode: {type:Number, default:4321 },
  emailverified: {type:Boolean, default:false},
  phoneverified: {type:Boolean,default:false},
}, schemaOptions)

UserSchema
    .virtual('credits')
    .get(function(){
        //Load Credits model
        var Credit = mongoose.model('Credit');
        Credit.aggregate([
            { $group: {
                _id: '5274d0e5a84be03f42000002',
                currentCredits: { $sum: '$amount'}
            }}
        ], function (err, results) {
                if (err) {
                    return 'N/A'
                } else {
                    return results[0].currentCredits.toString();
                    //return '40';
                }
            }
        );
    })

现在,这获得了价值,但无法正常工作(我无法检索虚拟“价值”信用)。我认为这是因为调用的异步性质。

有人可以建议实现这一目标的正确方法吗?

再次非常感谢您提供的任何意见。

编辑:

所以我试图遵循建议的方式,但到目前为止还没有运气。我无法调用我的“getCredits”方法。

这是我到目前为止所拥有的:

UserSchema.method.getCredits = function(cb) {
        //Load Credits model
        var Credit = mongoose.model('Credit');
        Credit.aggregate([
            { $group: {
                _id: '5274d0e5a84be03f42000002',
                currentCredits: { $sum: '$amount'}
            }}
        ], function (err, results) {
                cb(results);
            }
        );
};


var User = mongoose.model('User');

User.findOne({ _id : req.user._id })
.exec(function (err, tempuser) {
    tempuser.getCredits(function(result){

    });
})

有任何想法吗?再次感谢

4

1 回答 1

1

您的实施存在一些问题:

UserSchema.method.getCredits
           ^^^^^^ should be 'methods'

此外,您必须确保在创建模型之前将方法(和虚拟/静态)添加到架构中,否则它们将不会附加到模型中。

所以这是行不通的:

var MySchema = new mongoose.Schema(...);
var MyModel  = mongoose.model('MyModel', MySchema);

MySchema.methods.myMethod = ... // too late, model already exists

相反,使用这个:

var MySchema = new mongoose.Schema(...);

MySchema.methods.myMethod = ... 

var MyModel  = mongoose.model('MyModel', MySchema);

我还建议您始终检查/传播错误。

于 2013-11-03T06:58:53.930 回答