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.