Comment fusionner un champ de tableau dans un document dans l'agrégation Mongo

virus

J'ai une exigence où je dois faire une agrégation sur deux enregistrements ont tous deux un champ de tableau avec une valeur différente. Ce dont j'ai besoin, lorsque je fais une agrégation sur ces enregistrements, le résultat doit avoir un tableau avec des valeurs uniques des deux tableaux différents. Voici un exemple:

Premier enregistrement

 { Host:"abc.com" ArtId:"123", tags:[ "tag1", "tag2" ] }

Deuxième enregistrement

{ Host:"abc.com" ArtId:"123", tags:[ "tag2", "tag3" ] }

Après l'agrégation sur l'hôte et l'artid, j'ai besoin d'un résultat comme celui-ci:

 { Host: "abc.com", ArtId: "123", count :"2", tags:[ "tag1", "tag2", "tag3" ]}

J'ai essayé $addTosetdans la déclaration de groupe mais cela me donne des balises comme celles-ci:[["tag1","tag2"],["tag2","tag3"]]

Pourriez-vous s'il vous plaît m'aider comment je peux y parvenir en agrégation

Neil Lunn

TLDR;

Les versions modernes devraient utiliser $reduceavec $setUnionaprès la première $groupcomme le montre:

db.collection.aggregate([
  { "$group": {
    "_id": { "Host": "$Host", "ArtId": "$ArtId" },
    "count": { "$sum": 1 },
    "tags": { "$addToSet": "$tags" }
  }},
  { "$addFields": {
    "tags": {
      "$reduce": {
        "input": "$tags",
        "initialValue": [],
        "in": { "$setUnion": [ "$$value", "$$this" ] }
      }
    }
  }}
])

Vous aviez raison de trouver l' $addToSetopérateur, mais lorsque vous travaillez avec du contenu dans un tableau, vous devez généralement traiter d' $unwindabord avec . Cela «dé-normalise» les entrées du tableau et fait essentiellement une «copie» du document parent avec chaque entrée du tableau comme valeur singulière dans le champ. C'est ce dont vous avez besoin pour éviter le comportement que vous voyez sans l'utiliser.

Votre "compte" pose cependant un problème intéressant, mais facilement résolu grâce à l'utilisation d'un "double déroulement" après une $groupopération initiale :

db.collection.aggregate([
    // Group on the compound key and get the occurrences first
    { "$group": {
        "_id": { "Host": "$Host", "ArtId": "$ArtId" },
        "tcount": { "$sum": 1 },
        "ttags": { "$push": "$tags" }
    }},

    // Unwind twice because "ttags" is now an array of arrays
    { "$unwind": "$ttags" },
    { "$unwind": "$ttags" },

    // Now use $addToSet to get the distinct values        
    { "$group": {
        "_id": "$_id",
        "tcount": { "$first": "$tcount" },
        "tags": { "$addToSet": "$ttags" }
    }},

    // Optionally $project to get the fields out of the _id key
    { "$project": {
        "_id": 0,
        "Host": "$_id.Host",
        "ArtId": "$_id.ArtId",
        "count": "$tcount",
        "tags": "$ttags"
    }}
])

Ce dernier bit avec $projectest également là parce que j'ai utilisé des noms «temporaires» pour chacun des champs dans les autres étapes du pipeline d'agrégation. En effet, il existe une optimisation en ce sens $projectque "copie" les champs d'une étape existante dans l'ordre dans lequel ils sont déjà apparus "avant que" tout "nouveau" champ ne soit ajouté au document.

Sinon, la sortie ressemblerait à:

{  "count":2 , "tags":[ "tag1", "tag2", "tag3" ], "Host": "abc.com", "ArtId": "123" }

Où les champs ne sont pas dans le même ordre que vous pourriez le penser. Trivial vraiment, mais cela compte pour certaines personnes, il vaut donc la peine d'expliquer pourquoi et comment gérer.

Il en $unwindva de même pour garder les éléments séparés et non dans des tableaux, et faire le $grouppremier vous permet d'obtenir le «décompte» des occurrences de la clé de «regroupement».

L' $firstopérateur utilisé plus tard "garde" cette valeur "count", car il vient d'être "dupliqué" pour chaque valeur présente dans le tableau "tags". C'est de toute façon la même valeur, donc ce n'est pas grave. Choisissez-en un.

Cet article est collecté sur Internet, veuillez indiquer la source lors de la réimpression.

En cas d'infraction, veuillez [email protected] Supprimer.

modifier le
0

laisse moi dire quelques mots

0commentaires
connexionAprès avoir participé à la revue

Articles connexes

Comment fusionner un tableau et un champ de document dans Mongo DB

Comment trier plusieurs tableaux indépendamment dans un document mongo à l'aide de l'agrégation

Comment imbriquer un champ dans un champ de projection d'agrégation dans Spring Data Mongo

Sélectionnez un champ d'un document dans un tableau imbriqué à l'aide de l'agrégation

comment obtenir le tableau de valeurs d'un champ dans l'agrégation

Comment remplir un champ dans un tableau avec agrégation

Comment utiliser l'agrégation mongodb pour transformer un document dans un tableau imbriqué

Comment faire correspondre des éléments de tableau dans un document à tout autre tableau - agrégation mongodb

Comment utiliser la valeur d'un champ comme index de tableau dans l'étape $ addFields (agrégation)

agrégation mongo - nombre de documents où le champ dans un tableau est également dans un autre

obtenir un champ de sous-document dans l'étape d'agrégation $ project

Comment remplir un champ imbriqué dans un tableau d'objets en utilisant l'agrégation uniquement dans la mangouste ?

comment comparer deux champs dans un document dans l'agrégation de pipeline (mongoDB)

MongoDB : comment fusionner tous les documents en un seul document dans un pipeline d'agrégation

MongoDB : comment fusionner tous les documents en un seul document dans un pipeline d'agrégation

Faire correspondre un champ d'objet imbriqué présent dans un tableau dans l'agrégation de recherche

Comment regrouper des documents avec un champ spécifique dans l'agrégation de mongodb

Django: Comment utiliser un champ de clé étrangère dans l'agrégation?

Comment fusionner un tableau de documents dans Mongo DB

Comment faire une agrégation et un groupe dans un sous-champ de mongodb qui est un tableau?

Agrégation dans un élément de tableau - python

Projeter le premier élément d'un tableau dans un nouveau champ (agrégation MongoDB)

Renvoyer un document unique dans l'agrégation Mongo dans le pilote Go

Comment sortir l'objet d'un tableau à la racine du document dans MongoDB en utilisant l'agrégation?

L'agrégation Mongoldb vérifie combien de fois une valeur de champ dans un tableau apparaît ?

incrémenter ou soustraire un champ dans chaque document mongodb en utilisant l'agrégation

Agrégations Elasticsearch: renvoyez toujours un champ dans l'agrégation de termes

MongoDB - Structurer un tableau sans utiliser le champ clé dans l'agrégation

Comment agréger un champ de tableau distinct dans Mongodb

TOP liste

  1. 1

    Microsoft.WebApplication.targets

  2. 2

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  3. 3

    comment supprimer "compte de connexion google" à des fins de développement - actions sur google

  4. 4

    Comment ajouter une entrée à une table de base de données pour une combinaison de deux tables

  5. 5

    Passer la taille d'un tableau 2D à une fonction ?

  6. 6

    Exporter la table de l'arborescence vers CSV avec mise en forme

  7. 7

    Impossible d'accéder à la vue personnalisée pendant le test de l'interface utilisateur dans XCode

  8. 8

    Créer un système Buzzer à l'aide de python

  9. 9

    Comment changer le navigateur par défaut en Microsoft Edge pour Jupyter Notebook sous Windows 10 ?

  10. 10

    impossible d'obtenir l'image d'arrière-plan en plein écran dans reactjs

  11. 11

    Algorithme: diviser de manière optimale une chaîne en 3 sous-chaînes

  12. 12

    CSS: before ne fonctionne pas sur certains éléments,: after fonctionne très bien

  13. 13

    Conversion double en BigDecimal en Java

  14. 14

    Comment obtenir l'intégration contextuelle d'une phrase dans une phrase à l'aide de BERT ?

  15. 15

    Comment choisir le nombre de fragments et de répliques Elasticsearch

  16. 16

    Comment vérifier si un utilisateur spécifique a un rôle? Discord js

  17. 17

    Comment créer un bot à compte à rebours dans Discord en utilisant Python

  18. 18

    Existe-t-il un moyen de voir si mon bot est hors ligne ?

  19. 19

    comment afficher un bouton au-dessus d'un autre élément ?

  20. 20

    Comment activer le message Pylint "too-many-locals" dans VS Code?

  21. 21

    Je continue à obtenir l'objet 'WSGIRequest' n'a pas d'attribut 'Get' sur django

chaudétiquette

Archive