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

Policz odrębne pole dokumentu podrzędnego i wypisz jako nazwane klucze

Podstawowym przypadkiem jest tutaj użycie .aggregate() z $unwind ponieważ potrzebujesz dostępu do wartości w tablicy jako kluczy grupujących i oczywiście $group ponieważ w ten sposób „grupujesz” rzeczy:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
])

To da ci dane wyjściowe takie jak:

{ "_id": "ANTIQUES", "count": 56 }
{ "_id": "TOOLS", "count": 89 }
{ "_id": "JEWLRY", "count":  45 }

Teraz naprawdę powinieneś nauczyć się z tym żyć, ponieważ "lista" w domyślnym formacie kursora to dobra rzecz, którą można oczywiście iterować. Również nazwane klucze IMHO nie nadają się naturalnie do prezentacji danych i zazwyczaj potrzebujesz wspólnej właściwości na liście iterowalnej.

Jeśli naprawdę zamierzasz używać danych wyjściowych nazwanych kluczy w liczbie pojedynczej, będziesz potrzebować MongoDB 3.4.4 lub nowszej, aby mieć dostęp do $arrayToObject które pozwolą ci użyć wartości jako nazw kluczy i oczywiście $replaceRoot aby użyć tego wyrażenia jako nowego dokumentu do wytworzenia:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }},
  { "$group": {
    "_id": null,
    "data": { "$push": { "k": "$_id", "v": "$count" } }
  }},
  { "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": "$data"
    }
  }}
])

Lub jeśli nie masz tej opcji, zamiast tego powinieneś konwertować wynik kursora w kodzie:

db.collection.aggregate([
  { "$match": { "auctionId": 22 } },
  { "$unwind": "$itmLst" },
  { "$group": {
    "_id": "$itmLst.category",
    "count": { "$sum": 1 }
  }}
]).toArray().reduce((acc,curr) => 
  Object.assign(acc,{ [curr._id]: curr.count }),
  {}
)

Oba łączą się w jeden obiekt z nazwanymi kluczami z oryginalnego wyniku agregacji:

{
    "ANTIQUES": 56,
    "TOOLS": 89,
    "JEWLRY": 45,
    ...
}

To pokazuje, że oryginalny wynik wyjściowy był naprawdę wystarczający i zazwyczaj chcesz, aby tego rodzaju „ostateczne przekształcenie” zostało wykonane w kodzie, który używa danych wyjściowych kursora, jeśli naprawdę potrzebujesz tego przekształcenia w ogóle od podstawowego potrzebne dane i tak zostały zwrócone.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Parametr $all w mongodb nie działa z listą ObjectId

  2. Dekodowanie dzienników błędów MongoDB

  3. Dane aktualizacji MongoDB w polu zagnieżdżonym

  4. Jak uzyskać listę samych ObjectId używających pymongo?

  5. Co się stanie, jeśli odprężenie zostanie zastosowane do pola, którego nie ma podczas używania agregacji w manguście?