Ако трябва да върнете малка извадка от произволни документи от колекция, ето три подхода, които можете да опитате да използвате конвейера за агрегиране.
$sample Етап
$sample Етапът на конвейера на агрегация е проектиран специално за произволен избор на определен брой документи.
Когато използвате $sample , посочвате броя на документите, които искате да върнете в size поле.
Да предположим, че имаме следната колекция, наречена pets :
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :3, "име" :"Мяу", "тип" :"Котка", "тегло" :7 }{ "_id" :4, "име" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ " _id" :6, "name" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }
Можем да използваме $sample за да вземете произволна извадка от тези документи, както следва:
db.pets.aggregate( [ { $sample:{ size:3 } } ]) Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :5, "name" :"Bruce", "type" :"Прилеп", "тегло" :3 }{ "_id" :3, "name" :"Мяу", "тип" :"Котка", "тегло" :7 }
В този случай посочих { size: 3 } който върна три документа.
Тук отново се използва различен размер на извадката:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
) Резултат:
{ "_id" :6, "name" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }предварително>
$sample етапът работи по един от двата начина, в зависимост от това колко документи са в колекцията, размера на извадката спрямо броя на документите в колекцията и нейната позиция в конвейера. Вижте MongoDB $sample за обяснение как работи.
Възможно е също $sample етап може да върне един и същ документ повече от веднъж в неговия набор от резултати.
$rand Оператор
$rand Операторът е въведен в MongoDB 4.4.2 и целта му е да връща произволна float между 0 и 1 всеки път, когато бъде извикан.
Следователно можем да го използваме в $match етап във връзка с други оператори, като $expr и $lt за да върнете произволна извадка от документи.
Пример:
db.pets.aggregate(
[
{
$match:
{
$expr:
{
$lt: [ 0.5, { $rand: {} } ]
}
}
}
]
)
Резултат:
{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :6, "name" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }
Резултатът от този подход е различен от $sample подход, тъй като не връща фиксиран брой документи. Броят на документите, върнати с този подход, може да варира.
Например, ето какво се случва, когато стартирам същия код още няколко пъти.
Набор от резултати 2:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }
Набор от резултати 3:
{ "_id" :2, "name" :"Лая", "тип" :"Куче", "тегло" :10 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }
Набор от резултати 4:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :6, "name" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :8, "name" :"Щракване", "тип" :"Крокодил", "тегло" :400 }
Набор от резултати 5:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }предварително> $sampleRate Оператор
Въведен в MongoDB 4.4.2, $sampleRate операторът предоставя по-сбит начин да направите същото като предишния пример.
Когато използвате $sampleRate , предоставяте честота на дискретизация като число с плаваща запетая между 0 и 1 . Процесът на подбор използва равномерно произволно разпределение, а честотата на извадката, която предоставяте, представлява вероятността даден документ да бъде избран, докато преминава през тръбопровода.
Пример:
db.pets.aggregate(
[
{
$match: { $sampleRate: 0.5 }
}
]
)
Резултат:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :5, "име" :"Брус", "тип" :"Прилеп", "тегло" :3 }{ "_id" :6, "име" :"Hop", "type" :"Kenguroo", "weight" :130 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ " _id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }
И го стартирайте отново:
{ "_id" :3, "name" :"Meow", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :7, "name" :"Punch", "type" :"Gorilla", "weight" :300 }{ "_id" :8, "name" :"Snap", "type" :"Crocodile", "weight" :400 }{ "_id" :9, "name" :"Flutter", "type" :"Hummingbird", "weight" :1 }предварително>
И отново:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Куче", "тегло" :10 }{ "_id" :3, "име" :"Мяу", "тип" :"Котка", "тегло" :7 }{ "_id" :8, "име" :"Щракване", "тип" :"Крокодил", "тегло" :400 }