【问题标题】:How to select fiends including a new field which's value is sum of other specific fields with mongoose如何选择包含一个新字段的恶魔,该字段的值是其他特定字段与猫鼬的总和
【发布时间】:2017-01-23 10:39:59
【问题描述】:

我正在和猫鼬一起工作, 我想选择包含一个新字段的字段,该字段的值是其他特定字段的总和。 例如,有一个如下所示的模型架构。

const monsterSchema = new Schema({
 name: { type: String },
 power: { type: Number },
 armor: { type: Number },
});

我想选择具有“名称”、“力量”、“盔甲”、“总计”字段的记录。 该字段的值是“power”和“armor”的总和。

我该怎么做?

【问题讨论】:

    标签: mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    使用聚合框架,您可以通过 $project 管道步骤运行聚合操作,该管道步骤具有如下额外计算字段(假设您的 Mongoose 模型名为 Monster):

    Monster.aggregate([
        { 
            "$project": {
                "name": 1,
                "power": 1,
                "armor": 1,
                "new_field": { "$add": [ "$power", "$armor" ] }     
            }
        }
    ]).exec(function(err, result){
        if(err) handleError(err);
        console.log(JSON.stringify(result, null, 4));
    })
    

    【讨论】:

    • 非常感谢。无论如何,您知道填充后我该怎么做吗?例如像这样,'Collection.find().populate('_monster').aggregate(.....'。我不仅需要'Monster's 字段,还需要'Collection's 字段来创建具有以下价值的'新字段'其他特定字段的总和。
    • 很有可能,但因此您需要创建一个新问题,因为问题会在收到原始问题的答案后演变。任何更改都会使您已经收到的答案无效,并且通常会对那些愿意回答您问题的用户产生负面影响。
    • 我刚刚提出了另一个问题。 link
    【解决方案2】:

    您可以将虚拟字段添加到您的架构中。

    var personSchema = new Schema({
        name: {
          first: String,
          last: String
        }
    });
    
    personSchema.virtual('name.full').get(function () {
       return this.name.first + ' ' + this.name.last;
    });
    
    var Person = mongoose.model('Person', personSchema);
    

    这不会存储在文档中。希望对您有所帮助。 如果您想了解更多相关信息,请参阅以下链接。

    mongoose doc

    【讨论】:

    • 谢谢!这在某些情况下会非常有用。
    猜你喜欢
    • 2021-07-08
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 2021-01-25
    • 2017-09-30
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多