【问题标题】: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:使用架构编辑;)

标签: node.js mongodb mongoose


【解决方案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 到另一个类似的问题。
猜你喜欢
  • 2019-08-29
  • 2016-12-19
  • 2015-09-15
  • 2018-01-30
  • 2017-01-23
  • 2016-05-09
  • 2017-04-21
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多