MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

3 начина за връщане на произволна извадка от документи от колекция MongoDB

Ако трябва да върнете малка извадка от произволни документи от колекция, ето три подхода, които можете да опитате да използвате конвейера за агрегиране.

$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 }

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $in изисква масив като втори аргумент, намерено:липсва

  2. Как мога да комбинирам няколко колекции в една колекция, използвайки $lookup mongodb или nodejs mongodb?

  3. Няма достъп до свойството на обекта на отговора на Mongoose

  4. Импортирайте CSV данни като масив в MongoDB с помощта на mongoimport

  5. Изграждане на индекс на MongoDB – предотвратяване на потребителите да задействат нови компилации