sql >> Base de Datos >  >> NoSQL >> MongoDB

Reste $sum del subdocumento

En realidad, simplemente puedes hacer:

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

Desde MongoDB 3.2, en realidad puede $project con $sum y una matriz de argumentos (o una matriz) y, por lo tanto, no es necesario $unwind en absoluto.

La forma "larga", que es la forma "antigua", es usar $unwind , pero luego agregaría un $project siguiendo el $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" ] }
  }}
])

Y, por supuesto, necesita el $first acumulador para devolver el "price" campo del $group etapa para que pueda usarse en la etapa siguiente.

Pero si puedes hacer preserveNullAndEmptyArrays , entonces en realidad tiene MongoDB 3.2 y, por lo tanto, es mejor usar la instrucción sin el $unwind en absoluto, ya que es mucho más rápido hacerlo de esa manera.