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