4 votes

Comment ajouter automatiquement tous les champs sauf un lors d'une agrégation ?

J'ai une collection mongodb qui contient des objets qui ont plusieurs propriétés (probablement beaucoup). L'un d'entre eux est un tableau d'un autre type d'objet, et ce type a une propriété booléenne StateChanged .

Je veux faire une requête qui renvoie tous les enregistrements de cette collection, et filtrer le tableau pour n'obtenir que les documents avec StateChanged = true .

Voici ce que j'ai déjà fait :

db.getCollection('Cycles').aggregate([
    {
        $project: {
            _id: 0,
            // Here I could add Field1: 1, Field2: 1,...
            'Subcycles' : {
                $filter : {
                    input: '$Subcycles',
                    as : 'sub',
                    cond: { $eq: ['$$sub.StateChanged',true]}
                }
            }
        }
    }
])

Cependant, cela ne m'apporte que la collection "Subcycles". Ce que je veux, c'est inclure d'autres champs dans le document racine.

Je pourrais les spécifier manuellement dans la projection (comme Champ1 : 1, Champ2 : 1,...), mais comme il peut y avoir beaucoup de champs, je me demandais s'il existait un moyen de les amener tous automatiquement.

Merci d'avance !

4voto

Anthony Winzlet Points 10216

Vous pouvez utiliser $addFields au lieu de $project . Le nouveau champ sera automatiquement remplacé par le champ existant.

db.getCollection("Cycles").aggregate([
  { "$addFields": {
    "Subcycles": {
      "$filter": {
        "input": "$Subcycles",
        "as": "sub",
        "cond": { "$eq": ["$$sub.StateChanged", true] }
      }
    }
  }},
  { "$project" : { "_id": 0 }}
])

2voto

mickl Points 8755

Vous pouvez utiliser $addFields et utiliser ensuite $projet d'exclure _id domaine :

db.getCollection('Cycles').aggregate([
    {
        $addFields: {
            'Subcycles' : {
                $filter : {
                    input: '$Subcycles',
                    as : 'sub',
                    cond: { $eq: ['$$sub.StateChanged',true]}
                }
            }
        }
    },
    {
       $project: {
          _id: 0
       }
    }
])

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X