MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Subtrair $soma do Subdocumento


Na verdade, você pode simplesmente fazer:
db.table.aggregate( [
  { "$match" : { "tenantId": "paul" } },
  //{ $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
  { "$project":
    "deposits": { "$subtract": ["$price", { "$sum": "$deposits.amount" } ] }
  }}
])

Desde o MongoDB 3.2, você pode $project com $sum e uma matriz de argumentos ( ou uma matriz ) e, portanto, não precisa $unwind de forma alguma.

O caminho "longo", que é o caminho "antigo", é usar $unwind , mas você adicionaria um $project seguindo o $group :
db.table.aggregate( [
  { "$match" : { "tenantId": "paul" } },
  { $unwind:{ path: "$deposits", preserveNullAndEmptyArrays: true  }},
  { "$group":
    "_id": "$_id",
    "price": { "$first": "$price" },
    "deposits": { "$sum": "$deposits.amount" }
  }},
  { "$project": {
    "deposits": { "$subtract": [ "$price", "$deposits" ] }
  }}
])

E é claro que você precisa do $first acumulador para retornar o "price" campo do $group estágio para que possa ser usado no estágio seguinte.

Mas se você puder fazer preserveNullAndEmptyArrays , então você realmente tem o MongoDB 3.2 e, portanto, é melhor usar a instrução sem o $unwind em tudo, já que é muito mais rápido fazê-lo dessa maneira.