Mongo agrégation pour un champ DbRef avec mongoTemplate

Seneviratne Shock:

Supposons que j'ai deux collections mongo comme suit.

Collection A
{ 
    "_id" : ObjectId("582abcd85d2dfa67f44127e0"),
    "level" : "super"
    "dataReference" : Object
        B : DbRef(B, 5b618a570550de0021aaa2ef, undefined)
}

Collection B
{ 
    "_id" : ObjectId("5b618a570550de0021aaa2ef"),  
    "role" : "admin"
}

Il me faut récupérer les enregistrements de la collection A, quels documents ont valeur de champ « niveau » comme « super » et sa valeur liée « rôle » de la collection de disques B comme « admin ».

Pour cela, je suis en train d'utiliser l'agrégation et java mongoTemplate.

Voici le code que j'ai essayé, mais il retourne 0 enregistrements.

final TypedAggregation<A> typedAggregation = Aggregation.newAggregation(A.class,
                Aggregation.match(Criteria.where("level").equals(level)),
                Aggregation.lookup("B", "_id", "dataReference.B.$id", "Basb"),
                Aggregation.match(new Criteria().andOperator(
                        Criteria.where("B.role").regex("admin")
                )));

        final AggregationResults<Map> A = mongoTemplate.aggregate(typedAggregation, "A", Map.class);

S'il vous plaît noter que je suis nouveau à l'agrégation Mongo.

Valijon:

Il est laid solution calme:

MongoTemplate

Vous ne pouvez pas utiliser TypedAggregationparce que nous devons transformer la Acollection pour pouvoir se joindre à la Bcollection

Aggregation typedAggregation = Aggregation.newAggregation(
    Aggregation.match(Criteria.where("level").is("super")),
    new AggregationOperation() {
        @Override
        public Document toDocument(AggregationOperationContext context) {
            return Document.parse("{\"$addFields\":{\"dataReference\":{\"$reduce\":{\"input\":{\"$objectToArray\":\"$dataReference\"},\"initialValue\":null,\"in\":{\"$cond\":[{\"$eq\":[{\"$type\":\"$$this.v\"},\"objectId\"]},\"$$this.v\",\"$$value\"]}}}}}");
        }
    },
    Aggregation.lookup("B", "dataReference", "_id", "B"),
    Aggregation.match(new Criteria().andOperator(
             Criteria.where("B.role").regex("admin")
        )
    )
);

final AggregationResults<Document> A = mongoTemplate.aggregate(typedAggregation, "A", Document.class);

MongoDB agrégation

db.A.aggregate([
  {
    "$match": {
      "level": "super"
    }
  },
  {
    "$addFields": {
      "B": {
        "$reduce": {
          "input": {
            "$objectToArray": "$dataReference"
          },
          "initialValue": null,
          "in": {
            "$cond": [
              {
                "$eq": [
                  {
                    "$type": "$$this.v"
                  },
                  "objectId"
                ]
              },
              "$$this.v",
              "$$value"
            ]
          }
        }
      }
    }
  },
  {
    "$lookup": {
      "from": "B",
      "localField": "B",
      "foreignField": "_id",
      "as": "B"
    }
  },
  {
    "$match": {
      "$and": [
        {
          "B.role": {
            "$regex": "admin",
            "$options": ""
          }
        }
      ]
    }
  }
])

MongoPlayground

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

agrégation mongodb avec $ project pour exclure conditionnellement un champ

agrégation mongo pour ajouter un champ supprimé à la requête

Agrégation Mongo - fonction personnalisée pour créer un champ

Agrégation MongoDB avec $ lookup pour afficher uniquement le résultat d'un champ

Agrégation MongoDB avec $lookup pour le champ à l'intérieur d'un tableau

Comment remplir un champ dans un tableau avec agrégation

MongoDB : agrégation avec un champ contenant un point

MongoDB : agrégation avec un champ contenant un point

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

Agrégation Mongo : ajouter un champ dérivé d'un autre champ

Filtrer un graphique agrégé avec un autre champ d'agrégation

Elasticsearch d'agrégation imbriquée avec accès au champ parent pour la sous-agrégation

Créer un nouveau champ à partir d'un champ imbriqué avec framework d'agrégation, MongoDB

Chemin de champ dynamique pour $ set dans l'agrégation mongo db

Agrégation Mongo pour collecter des éléments de tableau en fonction du nom du champ

Requête d'agrégation Mongo pour filtrer les enregistrements avec un minimum et un nombre d'enregistrements pour un utilisateur

Existe-t-il un moyen de «supprimer» un champ lors d'une agrégation mongo?

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

Agrégation Mongo, projetez un sous-champ du premier élément du tableau

Utilisez l'agrégation pour faire correspondre un champ du document avec la taille de tableau de ce même document

Elastic Search, utilisez un champ scripté pour un résultat d'agrégation

agrégation imbriquée mongo avec jointure

Curseur avec agrégation Spring Data Mongo

agrégation mongo $lookup avec des tableaux

Comment utiliser l'agrégation pour compter les documents ET résumer un champ spécifique?

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

Agrégation Par date de correspondance $ ou avec un autre champ dans Mongodb en C #

Pipeline d'agrégation MongoDB: compter les documents avec un champ est inférieur à la valeur?

mongodb mongoTemplate obtenir un champ distinct avec certains critères

TOP liste

  1. 1

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

  2. 2

    Enregistrer le chemin de l'image de la galerie vers la base de données de la salle et l'afficher dans la liste des recycleurs

  3. 3

    Microsoft.WebApplication.targets

  4. 4

    knn classification 10 plis de l'outil et du tri

  5. 5

    Quelle est la relation entre le modèle et le tableau ? C'est compliqué

  6. 6

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

  7. 7

    Fonction de puissance en Java

  8. 8

    opérations en virgule flottante dans go

  9. 9

    Comment définir la couleur de l'intersection dans un diagramme de Venn?

  10. 10

    Spring @RequestParam DateTime format comme ISO 8601 Date Heure facultative

  11. 11

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

  12. 12

    AutoMapper.Collection.EFCore - Erreur générée lors de la configuration

  13. 13

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

  14. 14

    Comment remplir les valeurs manquantes avec plusieurs colonnes dans R

  15. 15

    Comment puis-je ajouter un UIView sous mon contrôleur de barre d'onglets par programme?

  16. 16

    Yat-il un référentiel maven application Java à démarrer rapidement 11

  17. 17

    Comment rechercher des éléments dans une ArrayList? - Java

  18. 18

    Comment utiliser HttpClient avec TOUT cert ssl, quelle que soit la « mauvaise » est

  19. 19

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

  20. 20

    Sélectionnez le bouton radio sur la saisie de texte

  21. 21

    Placez le modeBar en haut au centre à l'aide de plotly.js

chaudétiquette

Archive