在猫鼬中填充+聚合[重复]

Posted

技术标签:

【中文标题】在猫鼬中填充+聚合[重复]【英文标题】:Populate + Aggregate in Mongoose [duplicate] 【发布时间】:2015-12-23 16:36:18 【问题描述】:

我有两个 Mongoose 模型:一个用于交易,另一个用于与它们关联的标签。为了实现一些报告,我需要这样的聚合代码:

Transaction.aggregate([
   $unwind: '$tags' ,
  
    $group: 
      _id: '$tags',
      amount: 
        $sum: '$amount'
      
    
  
])

问题

这会产生包含_idamount 的输出。现在,我想从模型中填充其他字段(例如name),保留计算出的amount 列。我可以在一个简单的populate 中做到这一点吗?

编辑

我所描述的模型的架构:

var TransactionSchema = new Schema(
  description: 
    type: String,
    trim: true
  ,
  amount: 
    type: Number,
    required: 'Forneça um valor',
  ,
  date: 
    type: Date,
    required: 'Forneça uma data',
    default: Date.now
  ,
  fromOfx: 
    type: Boolean,
    default: false
  ,
  created: 
    type: Date,
    default: Date.now
  ,
  correlated: 
    type: Boolean,
    default: false
  ,
  tags: [
    type: Schema.Types.ObjectId,
    ref: 'TransactionTag'
  ],
  correlates: [
    type: Schema.Types.ObjectId,
    ref: 'Transaction'
  ],
  user: 
    type: Schema.Types.ObjectId,
    ref: 'User'
  
);

var TransactionTagSchema = new Schema(
  name: 
    type: String,
    required: 'Forneça um nome',
    trim: true
  ,
  description: 
    type: String,
    trim: true
  ,
  amount: 
    type: Number
  
);

【问题讨论】:

您好,您可以分享示例文档吗? @JohnnyHK:我认为这不是一回事,因为我有要填充的字段的 ObjectId,但我仍然需要保留 amount 字段的计算值.我确实尝试了该 sn-p,但该列根本没有填充。这是我的第一个大型 Node 项目,所以我非常讨厌调试它。我可以做些什么来诊断为什么该命令不起作用? @RohitJain:使用架构编辑;) 【参考方案1】:

您可以在从 MongoDB 获取数据后填充聚合。这看起来像这样:

// Your aggregate query from your question
Transaction.aggregate([
                            $unwind: '$tags'
                        , 
                            $group: 
                                _id: '$tags',
                                amount: 
                                    $sum: '$amount'
                                
                            
                        ])
    .exec(function(err, transactions) 
        // Don't forget your error handling
        // The callback with your transactions
        // Assuming you are having a Tag model
        Tag.populate(transactions, path: '_id', function(err, populatedTransactions) 
            // Your populated translactions are inside populatedTransactions
        );
    );

【讨论】:

完美!我试图通过填充path: 'tags',现在我想起来,让我觉得有点傻。现在还有一件事,这样做会将我的标签扔到_id 字段中。有没有一种 Mongo-y 方法可以让它们转到 tags 属性? 好的,我刚刚发现了$project。太好了! 从 3.2 开始,您现在可以使用 $lookup 功能在聚合管道中执行连接 - docs.mongodb.com/manual/reference/operator/aggregation/lookup @cyberwombat 是正确的,更详细的 in this answer 到另一个类似的问题。

以上是关于在猫鼬中填充+聚合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在猫鼬中反向填充

在猫鼬中填充嵌套模型

在猫鼬中填充嵌套模型

如何在猫鼬中填充嵌套实体?

如何在猫鼬中填充模型

在猫鼬中填充数据无法正常工作?