猫鼬聚合内部查找按字段分组
Mongoose aggregate internal lookup grouping by field
我正在尝试对所有不同的字段进行分组,然后查找另一个 table ,问题是我在查找中为同一用户添加了太多结果,所以我想知道如何才能在内部对这些结果进行分组,然后在下一阶段将另一个查找添加到不同的 table。
目前我有以下代码:
Post.aggregate([
{ "$group" : {"_id" : { "id_fanpage": "$id_fanpage" },"total": { $sum: 1 } } },
{
"$lookup": {
"from": "v3_post_reaccion_angry",
"localField": "_id.id_fanpage",
"foreignField": "id_fanpage",
"as": "resultingAngries"
}
},
{
"$lookup": {
"from": "v3_post_reaccion_compartir",
"localField": "_id.id_fanpage",
"foreignField": "id_fanpage",
"as": "resultingCompartir"
}
}
]).exec(function(err, results){
console.log(results);
return results
}).then(success(res))
我想要做的是通过 "id_fanpage" 区分 Post 行,然后通过返回的 id_fanpage 加入另一个 table 行,这基本上按预期工作,结果是这样的:
{
"_id": {
"id_fanpage": "5a63a96d1aa940ca0ada1c82"
},
"total": 831,
"resultingAngries": [
{
"_id": "5a71ccda1aa940dd154caf83",
"id_post": "5a71ccda1aa940dd154caf82",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": 345346565665,
"facebook_usuario_nombre": "AAAAAAAAAAAAAAAAA"
},
{
"_id": "5a71cd6b1aa940dd154ddb43",
"id_post": "5a71cd6b1aa940dd154ddb40",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "44444444444444444",
"facebook_usuario_nombre": "XXXXXXXXXXXXXXXX"
},
{
"_id": "5a71d7f61aa940dd156b60f4",
"id_post": "5a71d7f61aa940dd156b60e9",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "asdf12345232421",
"facebook_usuario_nombre": "YYYYYYYYYYYYYY"
},
{
"_id": "5a71cde11aa940dd154ec514",
"id_post": "5a71cde11aa940dd154ec513",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "asdf2345234555",
"facebook_usuario_nombre": "ZZZZZZZZZZZZZZ"
},
{
"_id": "5a71cdcb1aa940dd154e917a",
"id_post": "5a71cdcb1aa940dd154e9178",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "44444444444444444",
"facebook_usuario_nombre": "XXXXXXXXXXXXXXX"
}
]
}
现在的问题是,我想按 facebook_usuario_id 对 resultAngries 中的所有结果进行分组,并且还能够将其添加到下一次查找中,但据我所知我不能在之后使用分组第一次查找而不影响下一次查找。
所以结果应该是:
{
"_id": {
"id_fanpage": "5a63a96d1aa940ca0ada1c82"
},
"total": 831,
"resultingAngries": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
"resultingLikes": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
},
{
"_id": {
"id_fanpage": "5a63a96d1aa942345wedf23455s"
},
"total": 20,
"resultingLikes": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
},
"resultingAngries": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
等等。
我已经看过聚合和查找,但不确定 $addToSet 是否可以做到,因为到目前为止我无法在内部分组,所以应用 addToSet 给我带来了困难。帮助将不胜感激。
在您的 $lookup 之间插入以下三个阶段。
下面的步骤 $unwind
resultingAngries
array followed by first $group
to count the distinct combination of facebook_usuario_id
& id_fanpage
and second $group
to $push
将 count
和 facebook_usuario_id
返回到 resultingAngries
数组。
{"$unwind":"$resultingAngries"},
{"$group":{
"_id":{
"id_fanpage":"$_id.id_fanpage",
"facebook_usuario_id":"$resultingAngries.facebook_usuario_id"
},
"total":{"$first":"$total"},
"count":{"$sum":1}
}},
{"$group":{
"_id":{"id_fanpage":"$_id.id_fanpage"},
"total":{"$first":"$total"},
"resultingAngries":{
"$push":{
"_id":"$_id.facebook_usuario_id",
"count":"$count"
}
}
}}
我正在尝试对所有不同的字段进行分组,然后查找另一个 table ,问题是我在查找中为同一用户添加了太多结果,所以我想知道如何才能在内部对这些结果进行分组,然后在下一阶段将另一个查找添加到不同的 table。 目前我有以下代码:
Post.aggregate([
{ "$group" : {"_id" : { "id_fanpage": "$id_fanpage" },"total": { $sum: 1 } } },
{
"$lookup": {
"from": "v3_post_reaccion_angry",
"localField": "_id.id_fanpage",
"foreignField": "id_fanpage",
"as": "resultingAngries"
}
},
{
"$lookup": {
"from": "v3_post_reaccion_compartir",
"localField": "_id.id_fanpage",
"foreignField": "id_fanpage",
"as": "resultingCompartir"
}
}
]).exec(function(err, results){
console.log(results);
return results
}).then(success(res))
我想要做的是通过 "id_fanpage" 区分 Post 行,然后通过返回的 id_fanpage 加入另一个 table 行,这基本上按预期工作,结果是这样的:
{
"_id": {
"id_fanpage": "5a63a96d1aa940ca0ada1c82"
},
"total": 831,
"resultingAngries": [
{
"_id": "5a71ccda1aa940dd154caf83",
"id_post": "5a71ccda1aa940dd154caf82",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": 345346565665,
"facebook_usuario_nombre": "AAAAAAAAAAAAAAAAA"
},
{
"_id": "5a71cd6b1aa940dd154ddb43",
"id_post": "5a71cd6b1aa940dd154ddb40",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "44444444444444444",
"facebook_usuario_nombre": "XXXXXXXXXXXXXXXX"
},
{
"_id": "5a71d7f61aa940dd156b60f4",
"id_post": "5a71d7f61aa940dd156b60e9",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "asdf12345232421",
"facebook_usuario_nombre": "YYYYYYYYYYYYYY"
},
{
"_id": "5a71cde11aa940dd154ec514",
"id_post": "5a71cde11aa940dd154ec513",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "asdf2345234555",
"facebook_usuario_nombre": "ZZZZZZZZZZZZZZ"
},
{
"_id": "5a71cdcb1aa940dd154e917a",
"id_post": "5a71cdcb1aa940dd154e9178",
"id_fanpage": "5a63a96d1aa940ca0ada1c82",
"facebook_usuario_id": "44444444444444444",
"facebook_usuario_nombre": "XXXXXXXXXXXXXXX"
}
]
}
现在的问题是,我想按 facebook_usuario_id 对 resultAngries 中的所有结果进行分组,并且还能够将其添加到下一次查找中,但据我所知我不能在之后使用分组第一次查找而不影响下一次查找。 所以结果应该是:
{
"_id": {
"id_fanpage": "5a63a96d1aa940ca0ada1c82"
},
"total": 831,
"resultingAngries": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
"resultingLikes": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
},
{
"_id": {
"id_fanpage": "5a63a96d1aa942345wedf23455s"
},
"total": 20,
"resultingLikes": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
},
"resultingAngries": [
{
"_id": "this is my user id 1111111111",
"count": N,
},
{
"_id": "this is my user id 2222222222",
"count": Y,
}
],
等等。 我已经看过聚合和查找,但不确定 $addToSet 是否可以做到,因为到目前为止我无法在内部分组,所以应用 addToSet 给我带来了困难。帮助将不胜感激。
在您的 $lookup 之间插入以下三个阶段。
下面的步骤 $unwind
resultingAngries
array followed by first $group
to count the distinct combination of facebook_usuario_id
& id_fanpage
and second $group
to $push
将 count
和 facebook_usuario_id
返回到 resultingAngries
数组。
{"$unwind":"$resultingAngries"},
{"$group":{
"_id":{
"id_fanpage":"$_id.id_fanpage",
"facebook_usuario_id":"$resultingAngries.facebook_usuario_id"
},
"total":{"$first":"$total"},
"count":{"$sum":1}
}},
{"$group":{
"_id":{"id_fanpage":"$_id.id_fanpage"},
"total":{"$first":"$total"},
"resultingAngries":{
"$push":{
"_id":"$_id.facebook_usuario_id",
"count":"$count"
}
}
}}