根据来自另一个模型的异步查询在模型中设置虚拟字段

Posted

技术标签:

【中文标题】根据来自另一个模型的异步查询在模型中设置虚拟字段【英文标题】:Setting a virtual field in a Model based on an async query from another model 【发布时间】:2013-11-13 14:26:30 【问题描述】:

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

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

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)

    );
)

有什么想法吗?再次感谢

【问题讨论】:

duplicate 感谢 robertklep,我尝试了此处建议的解决方案,但无法使聚合函数正常工作。我会再试一次看看我犯了一个错误 我只是无法让我的 'getCredits' 方法起作用.. 叹息 【参考方案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);

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

【讨论】:

完美解决了我的问题。感谢您花时间向我解释这一点。

以上是关于根据来自另一个模型的异步查询在模型中设置虚拟字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 会话模型中设置自定义字段?

Django ORM - 模型引用另一个模型ManyToMany字段

如何使用 on_delete 属性在用户模型的外键字段中设置用户全名?

如何在模型 laravel 中设置固定位置查询

如何在抽象模型中的ManyToMany字段中设置related_name?

POCO 模型和计算字段