是否可以聚合通过 DBRef 存储的数据?
蒙戈 2.6
假设我有如下交易数据:
{
_id : ObjectId(...),
user : DBRef("user", ObjectId(...)),
product : DBRef("product", ObjectId(...)),
source : DBRef("website", ObjectId(...)),
quantity : 3,
price : 40.95,
total_price : 122.85,
sold_at : ISODate("2015-07-08T09:09:40.262-0700")
}
诀窍是“source”本质上是多态的——它可能是不同的 $ref 值,例如“webpage”、“call_center”等,它们也有不同的 ObjectId。例如 DBRef("webpage", ObjectId("1")) 和 DBRef("webpage",ObjectId("2")) 将是交易发起的两个不同网页。
我想最终在一段时间内(比如一个月)按来源汇总:
db.coll.aggregate( { $match : { sold_at : { $gte : start, $lt : end } } },
{ $project : { source : 1, total_price : 1 } },
{ $group : {
_id : { "source.$ref" : "$source.$ref" },
count : { $sum : $total_price }
} } );
诀窍是您尝试使用以 $ 开头的变量时遇到路径错误,方法是尝试按它进行分组或尝试使用表达式通过项目进行转换。
有什么办法可以做到这一点?实际上试图通过聚合将这些数据推送到子集合以在那里对其进行操作。试图避免对数百万条记录进行大型游标操作来转换数据,以便我可以聚合它。