在猫鼬中填充+聚合[重复]
Posted
技术标签:
【中文标题】在猫鼬中填充+聚合[重复]【英文标题】:Populate + Aggregate in Mongoose [duplicate] 【发布时间】:2015-12-23 16:36:18 【问题描述】:我有两个 Mongoose 模型:一个用于交易,另一个用于与它们关联的标签。为了实现一些报告,我需要这样的聚合代码:
Transaction.aggregate([
$unwind: '$tags' ,
$group:
_id: '$tags',
amount:
$sum: '$amount'
])
问题
这会产生包含_id
和amount
的输出。现在,我想从模型中填充其他字段(例如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 到另一个类似的问题。以上是关于在猫鼬中填充+聚合[重复]的主要内容,如果未能解决你的问题,请参考以下文章