web-dev-qa-db-fra.com

Mongodb - agrégation $ Push si conditionnel

J'essaie d'agréger un lot de documents. Il y a deux champs dans les documents que je voudrais $ Push. Cependant, disons que ce sont des champs "_id" et "A", je veux seulement $ Push "_id" et "A" si "A" est $ gt 0.

J'ai essayé deux approches.

Premier.

db.collection.aggregate([{
"$group":{
    "field": {
        "$Push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$Push":"$B"}
}])

Mais cela poussera une valeur nulle vers "champ" et je n'en veux pas.

Deuxième.

db.collection.aggregate([{
"$group":
    "field": {
        "$cond":[
            {"$gt",["$A", 0]},
            {"$Push": {"id":"$_id", "A":"$A"}},
            null
        ]
    },
    "secondField":{"$Push":"$B"}
}])

Le second ne fonctionne tout simplement pas ...

Existe-t-il un moyen d'ignorer $ Push dans le cas contraire?

AJOUTÉ:

Documents attendus:

{
    "_id":objectid(1),
    "A":2,
    "B":"One"
},
{
    "_id":objectid(2),
    "A":3,
    "B":"Two"
},
{
    "_id":objectid(3),
    "B":"Three"
}

Production attendue:

{
    "field":[
        {
            "A":"2",
            "_id":objectid(1)
        },
        {
            "A":"3",
            "_id":objectid(2)
        },
    ],
    "secondField":["One", "Two", "Three"]
}
12
Artorias

Ceci est ma réponse à la question après avoir lu le post suggéré par @Veeram

db.collection.aggregate([{
"$group":{
    "field": {
        "$Push": {
            "$cond":[
                {"$gt":["$A", 0]},
                {"id": "$_id", "A":"$A"},
                null
            ]
        }
    },
    "secondField":{"$Push":"$B"}
},
{
    "$project": {
        "A":{"$setDifferrence":["$A", [null]]},
        "B":"$B"
    }
}])
8
Artorias

Une autre option consiste à utiliser l'opérateur $ filter:

db.collection.aggregate([
{ 
    $group : {
        _id: null,
        field: { $Push: { id: "$_id", A : "$A"}},
        secondField:{ $Push: "$B" }
    }
},
{
    $project: {
        field: {
            $filter: {
                input: "$field",
                as: "item",
                cond: { $gt: [ "$$item.A", 0 ] }
            }
        },
        secondField: "$secondField"
    }       
}])

À la première étape, vous combinez votre tableau et les filtrez à la deuxième étape

3
Artyom