Mongodb 使用mongoose对填充值进行聚合

Mongodb 使用mongoose对填充值进行聚合,mongodb,mongoose,aggregation-framework,mongoose-schema,Mongodb,Mongoose,Aggregation Framework,Mongoose Schema,我将非常感谢您对以下场景的帮助。 我有这个模式: var-Song=Schema{ 作者:{type:Schema.Types.ObjectId,ref:'user'}, 标题:字符串, 照片:弦, 日期:日期:, 持续时间:数字, 视图:[{type:Schema.Types.ObjectId,ref:'user'}], likes:[{type:Schema.Types.ObjectId,ref:'user'}] } var User=mongoose.Schema{ 电子邮件:String

我将非常感谢您对以下场景的帮助。 我有这个模式:

var-Song=Schema{ 作者:{type:Schema.Types.ObjectId,ref:'user'}, 标题:字符串, 照片:弦, 日期:日期:, 持续时间:数字, 视图:[{type:Schema.Types.ObjectId,ref:'user'}], likes:[{type:Schema.Types.ObjectId,ref:'user'}] } var User=mongoose.Schema{ 电子邮件:String, 名称:String, 性别:String,, 生日:弦, 城市:字符串, 大陆:弦 }; 我想写一个查询,向用户提供每个大陆的歌曲组的总喜好和观点。例如:

{大陆:'亚洲',视野:4000,喜欢:5000}, {大陆:'欧洲',观点:3200,喜欢:4500} 另外,我很高兴知道这是否被认为是一个繁重的查询,也许将like和view保存为用户ID与大陆的组合是一个更明智的想法。

而不是.populate,这是一个希望数据在服务器上加入的客户端操作,.aggregate是一个服务器端操作。这就是操作员的职责:

它可能是最适合某个类型的,并且在执行

宋元[ {$项目:{ 作者:$author, 数据:{ $concatarray:[ {$map:{ 输入:$视图, as:el, 在:{type:views,_id:$$el} }}, {$map:{ 输入:$likes, as:el, 在:{type:likes,_id:$$el} }} ] } }}, {$unwind:$data}, {$lookup:{ 发件人:用户, localField:data.\u id, foreignField:\u id, as:数据。\u id }}, {$unwind:$data.\u id}, {$group:{ _身份证:{ 作者:$author, 大陆:$data.\u id.大陆 }, 观点:{ $sum:{$cond:[{$eq:[$data.type,views]},1,0]} }, 喜欢:{ $sum:{$cond:[{$eq:[$data.type,likes]},1,0]} } }} ],函数错误,结果{ } 你在开始时加入这个数组,因为在某一点上,你希望在一个数组中包含like和view,因为如果我们试图在以后的操作中单独处理它们,你需要这样做,以便计算constance的值,那么你最终会得到一个笛卡尔积,因为一个数组的内容将乘以内容以另一种形式出现

因此,我们用一个类型来标记,因为它们不再位于单独的字段中,我们仍然需要在喜欢和视图之间进行区分以进行计数

该操作能够在大多数现代版本中使用平面数组,但不能使用从第一阶段构建的文档数组。只需先处理

完成后,此表单中的结果将是数据路径中包含的每个结果的单个元素数组。为了继续处理,我们再次

最后,您将看到一个复合键用于从关联数据获得的作者值和大陆值。为了计数,每个like和view都应用于一个表达式,该表达式是三元if/then/else运算符。在第一个参数中给定一个条件,如果该条件为true,则返回第二个参数值,如果为false,则返回第三个参数值

这些表达式的结果被传递给累加,因此当条件匹配时,将返回一个正计数,并为分组键累加

所有聚合都是繁重的操作,而执行连接实际上被认为更为繁重


在很多情况下,应用程序在运行时执行这种类型的查询并没有什么问题。这实际上取决于数据是否以有效速度运行。如果数据相当大,以至于此类操作花费了过多的时间,那么您应该通过在单独的记录中累积此类汇总数据来进行预聚合。在这种情况下,在每个大陆或诸如此类的地方增加每个作者的like或view计数。

非常感谢,这是我得到的最好的答案-非常有用:-再问一个问题,是否可以按顺序对大陆进行分组,结果将如下所示:{作者:用户对象,视图和like:{{大陆:亚洲,视野:1000,视野:2000},{大陆:欧洲,视野:0,视野:0},{大陆:美洲,视野:10,视野:20},}