/ / MongoDB - Trouver le premier et le dernier dans le tableau intégré pour un seul document correspondant - mongodb

MongoDB - Recherche le premier et le dernier dans le tableau incorporé pour un seul document correspondant - mongodb

J'ai une collection de sites Web, chacuncontiennent une liste de sites Web et leurs mots-clés qui sont suivis. J'ai également une autre collection appelée «classements» qui pour chacun des mots-clés du site Web contient un classement. Jusqu'à présent, la collection ressemble à ceci:

{
"_id" : ObjectId("58503934034b512b419a6eab"),
"website" : "https://www.google.com",
"name" : "Google",
"keywords" : [
"Search",
"Websites",
],
"tracking" : [
{
"_id" : ObjectId("5874aa1df63258286528598d"),
"position" : 0,
"created_at" : ISODate("2017-01-1T09:32:13.831Z"),
"real_url" : "https://www.google.com",
"keyword" : "Search"
},
{
"_id" : ObjectId("5874aa1ff63258286528598e"),
"keyword" : "Search",
"real_url" : "https://www.google.com",
"created_at" : ISODate("2017-01-2T09:32:15.832Z"),
"found_url" : "https://google.com/",
"position" : 3
},
{
"_id" : ObjectId("5874aa21f63258286528598f"),
"keyword" : "Search",
"real_url" : "https://www.foamymedia.com",
"created_at" : ISODate("2017-01-3T09:32:17.017Z"),
"found_url" : "https://google.com/",
"position" : 2
},

{
"_id" : ObjectId("5874aa21f63258286528532f"),
"keyword" : "Websites",
"real_url" : "https://www.google.com",
"created_at" : ISODate("2017-01-1T09:32:17.017Z"),
"found_url" : "https://google.com/",
"position" : 1
},

{
"_id" : ObjectId("5874aa21f63258286528542f"),
"keyword" : "Websites",
"real_url" : "https://www.google.com",
"created_at" : ISODate("2017-01-1T09:32:17.017Z"),
"found_url" : "https://google.com/",
"position" : 2
},

]
}

Ce que je veux faire c'est:

1) Regroupez tous les mots-clés par leur mot-clé

2) Trouvez la position de départ (au tout début du mois)

3) Trouvez la position actuelle (à partir d'aujourd'hui)

Donc, en théorie, je veux recevoir un objet comme:

{
"_id" : ObjectId("58503934034b512b419a6eab"),
"website" : "https://www.google.com",

"tracking" : [
{
"_id" : ObjectId("5874aa1df63258286528598d"),
"keyword": "Search",
"start_position": 0,
"todays_position": 3,

},

{
"_id" : ObjectId("5874aa1df63258286528598d"),
"keyword": "Website",
"start_position": 0,
"todays_position": 2,

},


]

Je ne sais pas comment faire le regroupement sur un autre champ, cependant. J'ai essayé ce qui suit jusqu'à présent:

db.getCollection("websites").aggregate([

{
$lookup: {
from: "seo_tracking",
localField: "website",
foreignField: "real_url",
as: "tracking"
}
},

{
$match: {
"_id" : ObjectId("58503934034b512b419a6eab")
}
},

{
$group: {
"_id" : "$_id",
"keyword" : {
$first: "$tracking.keyword",
},
}
}

]);

Mais ce n'est pas un regroupement par mot-clé, et je ne peux pas non plus comprendre comment j'obtiendrais la valeur attendue.

Réponses:

1 pour la réponse № 1

Vous pouvez essayer quelque chose comme ça. $unwind le tableau de suivi suivi de $sort sur tracking.keyword et tracking.created_at. $group par tracking.keyword et $first pour obtenir la position de départ, $avg pour obtenir une position moyenne et $last pour obtenir la position d'aujourd'hui. Finale $group pour tout retrousser tracking tableau.

db.website.aggregate([{
$match: {
"_id": ObjectId("58503934034b512b419a6eab")
}
}, {
$lookup: {
from: "seo_tracking",
localField: "website",
foreignField: "real_url",
as: "tracking"
}
}, {
$unwind: "$tracking"
}, {
$sort: {
"tracking.keyword": 1,
"tracking.created_at": -1
}
}, {
$group: {
"_id": "$tracking.keyword",
"website": {
$first: "$website"
},
"website_id": {
$first: "$_id"
},
"avg_position": {
$avg: "$tracking.position"
},
"start_position": {
$first: "$tracking.position"
},
"todays_position": {
$last: "$tracking.position"
}
}
}, {
$group: {
"_id": "$website_id",
"website": {
$first: "$website"
},
"tracking": {
$push: {
"keyword": "$_id",
"avg_position":"$avg_position",
"start_position": "$start_position",
"todays_position": "$todays_position"
}
}
}
}]);