MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Odejmij $sumę od poddokumentu

Właściwie możesz po prostu zrobić:

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

Od MongoDB 3.2 możesz właściwie $project z $sum i tablicę argumentów (lub tablicę) i dlatego nie trzeba $unwind w ogóle.

„Długi” sposób, który jest „stary”, polega na użyciu $unwind , ale w rzeczywistości dodałbyś $project zgodnie z $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" ] }
  }}
])

I oczywiście potrzebujesz wtedy $first akumulator w celu zwrócenia "price" pole z $group etapie, aby można go było użyć w następnym etapie.

Ale jeśli możesz zrobić preserveNullAndEmptyArrays , to faktycznie masz MongoDB 3.2 i dlatego lepiej jest użyć wyrażenia bez $unwind w ogóle, ponieważ w ten sposób jest znacznie szybciej.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB:jak znaleźć dokumenty ignorujące wielkość liter, akcenty i procent jak logikę (%)

  2. mongodb c# wybierz konkretną notację z kropką w polu

  3. Sailsjs - Niestandardowe logowanie z Winston

  4. Zapytanie mongodb danych Spring automatycznie konwertuje String na ObjectId

  5. jak obliczyć liczbę i unikatową liczbę na dwóch polach w funkcji mongo Reduce