sql >> Databáze >  >> NoSQL >> MongoDB

Mongo Seřadit podle počtu zápasů v poli

Chcete-li na to nejprve odpovědět, musíte "spočítat" počet shod pro danou podmínku, abyste "seřadili" výsledky tak, aby se vrátily s preferencí nejvíce shod navrchu.

K tomu potřebujete agregační rámec, který používáte pro „výpočet“ a „manipulaci“ dat v MongoDB:

db.multiArr.aggregate([
  { "$match": { "Keys": { "$in": [ "carrot", "banana" ] } } },
  { "$project": {
    "ID": 1,
    "Keys": 1,
    "order": {
      "$size": {
        "$setIntersection": [ ["carrot", "banana"], "$Keys" ]
      }
    }
  }},
  { "$sort": { "order": -1 } }
])

Na MongoDB starším než verze 3 pak můžete udělat delší formu:

db.multiArr.aggregate([
  { "$match": { "Keys": { "$in": [ "carrot", "banana" ] } } },
  { "$unwind": "$Keys" },
  { "$group": {
    "_id": "$_id",
    "ID": { "$first": "$ID" },
    "Keys": { "$push": "$Keys" },
    "order": {
      "$sum": {
        { "$cond": [
          { "$or": [
           { "$eq": [ "$Keys", "carrot" ] },
           { "$eq": [ "$Keys", "banana" ] }
         ]},
         1,
         0
        ]}
      }
    }
  }},
  { "$sort": { "order": -1 } }
])

V obou případech je zde funkcí nejprve přiřadit možné dokumenty k podmínkám poskytnutím "seznamu" argumentů s $in . Jakmile získáte výsledky, chcete "spočítat" počet odpovídajících prvků v poli do "seznamu" možných hodnot.

V moderní podobě $setIntersection operátor porovná dva "seznamy" a vrátí nové pole, které obsahuje pouze "jedinečné" odpovídající členy. Protože chceme vědět, kolik shod to bylo, jednoduše vrátíme $size tohoto seznamu.

Ve starších verzích rozbalíte pole dokumentů pomocí $unwind za účelem provádění operací na něm, protože starší verze postrádaly novější operátory, které pracovaly s poli beze změn. Proces se pak podívá na každou hodnotu jednotlivě a pokud buď výraz v $or odpovídá možným hodnotám, pak $cond ternární vrátí hodnotu 1 na $sum akumulátor, jinak 0 . Čistým výsledkem je stejný „počet shod“, jaký je zobrazen u moderní verze.

Poslední věcí je jednoduše $sort výsledky založené na "počtu zápasů", které byly vráceny, takže nejvíce zápasů je "nahoře". Toto je "sestupné pořadí", a proto zadáte -1 to naznačit.

Dodatek týkající se $in a polí

Pro začátek nechápete pár věcí o dotazech MongoDB. $in operátor je ve skutečnosti určen pro "seznam" argumentů, jako je tento:

{ "Keys": { "$in": [ "carrot", "banana" ] } }

Což je v podstatě zkrácený způsob, jak říci „Přiřaďte buď „mrkev“ nebo „banán“ ve vlastnosti „Klíče“ . A mohl by být dokonce napsán v dlouhé formě takto:

{ "$or": [{ "Keys": "carrot" }, { "Keys": "banana" }] }

Což by vás skutečně mělo vést, pokud by šlo o „jedinou“ podmínku shody, pak jednoduše dodáte hodnotu, která se má shodovat s vlastnost:

{ "Keys": "carrot" }

To by tedy mělo pokrýt mylnou představu, že používáte $in aby odpovídala vlastnosti, která je polem v dokumentu. Spíše „obrácený“ případ je zamýšlené použití, kde místo toho dodáte „seznam argumentů“, aby odpovídaly dané vlastnosti, ať už jde o vlastnost pole nebo jen jednu hodnotu.

Dotazovací stroj MongoDB nerozlišuje mezi jednou hodnotou nebo polem hodnot v operaci rovnosti nebo podobné operaci.




  1. vrátit dotaz na základě data

  2. Transakce Mongodb v4.0, MongoError:Čísla transakcí jsou povolena pouze u člena sady replik nebo mongo

  3. umístění na žebříčku v mongo s okolními hráči

  4. Aktualizace cesty 'x' by vytvořila konflikt v 'x'