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"]
}
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"
}
}])
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