Ако трябва да върнете малка извадка от произволни документи от колекция, ето три подхода, които можете да опитате да използвате конвейера за агрегиране.
$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 }