В MongoDB, $sampleRate
Етапът на конвейера на агрегация съответства на произволен избор на входни документи.
Броят на избраните документи е приблизителен процент на извадката, изразен като процент от общия брой документи.
$sampleRate
операторът беше въведен в MongoDB 4.4.2.
Когато използвате $sampleRate
, предоставяте честотата на дискретизация като число с плаваща запетая между 0
и 1
. Процесът на подбор използва равномерно произволно разпределение, а честотата на извадката, която предоставяте, представлява вероятността даден документ да бъде избран, докато преминава през тръбопровода.
Пример
Да предположим, че имаме колекция, наречена employees
със следните документи:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Можем да използваме $sample
етап, за да изберете произволно определен брой документи от тази колекция.
Пример:
db.employees.aggregate(
[
{
$match: { $sampleRate: 0.33 }
}
]
)
Резултат:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Чрез предоставяне на честота на дискретизация от 0.33
, уточнихме, че приблизително една трета от документите трябва да бъдат върнати.
Реалният резултат обаче може да варира значително в зависимост от това колко документа има в колекцията. Колекциите с по-малък брой документи ще имат доста разнообразни резултати, докато по-големите колекции трябва да са по-близо до очакваното равномерно разпределение на случаен принцип.
За да демонстрирам това, ето набора от резултати, който получавам, когато стартирам същия код отново:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
И отново:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
И още веднъж:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Това е по-малка колекция и така резултатите се различават значително.
Ако искате да върнете точен брой документи, използвайте $sample
етап вместо това.