2013-04-17 14 views
5

mam te rzeczy w mojej kolekcji MongoDB:Wyraźny() komenda używana z SKIP() i limitu()

{x: 1, y: 60, z:100} 
{x: 1, y: 60, z:100} 
{x: 1, y: 60, z:100} 
{x: 2, y: 60, z:100} 
{x: 2, y: 60, z:100} 
{x: 3, y: 60, z:100} 
{x: 4, y: 60, z:100} 
{x: 4, y: 60, z:100} 
{x: 5, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 6, y: 60, z:100} 
{x: 7, y: 60, z:100} 
{x: 7, y: 60, z:100} 

chcę kwerendy odrębne wartości X (tj [1, 2, 3 , 4, 5, 6, 7]) ... ale chcę tylko część z nich (podobne do tego, co możemy uzyskać z pominięciem (a) i ograniczeniem (b)).

Jak to zrobić ze sterownikiem java MongoDB (lub, jeśli to możliwe, z wiosennymi danymi-mongodb)?

Odpowiedz

1

W zależności od przypadku zastosowania, można znaleźć takie podejście będzie bardziej wydajnych niż agregacji. Oto przykładowa funkcja powłoki Mongo.

function getDistinctValues(skip, limit) { 

    var q = {x:{$gt: MinKey()}}; // query 
    var s = {x:1};    // sort key 

    var results = []; 

    for(var i = 0; i < skip; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      return results; 
     } 
     q.x.$gt = result.x; 
    } 

    for(var i = 0; i < limit; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      break; 
     } 
     results.push(result.x); 
     q.x.$gt = result.x; 
    } 

    return results; 

} 

Jesteśmy w zasadzie tylko znalezienie wartości po jednym na raz, przy użyciu kwerendy i sortowania, aby pominąć wartości przeszłych już widzieliśmy. Możesz to łatwo poprawić, dodając więcej argumentów, aby funkcja była bardziej elastyczna. Ponadto utworzenie indeksu na właściwości, która ma znaleźć różne wartości, poprawi wydajność.

Mniej oczywistą poprawą byłoby pominięcie fazy "pominięcia" i określenie wartości, z której należy kontynuować. Oto przykładowa funkcja powłoki Mongo.

function getDistinctValues(limit, lastValue) { 

    var q = {x:{$gt: lastValue === undefined ? MinKey() : lastValue}}; // query 
    var s = {x:1};    // sort key 

    var results = []; 

    for(var i = 0; i < limit; i++) { 
     var result = db.test.find(q).limit(1).sort(s).toArray()[0]; 
     if(!result) { 
      break; 
     } 
     results.push(result.x); 
     q.x.$gt = result.x; 
    } 

    return results; 

} 

Jeśli zdecydujesz się użyć techniki agregacji, dodaj etap sortowania $ po etapie grupy $. W przeciwnym razie wyniki nie będą wyświetlane w przewidywalnej kolejności.

+0

Jest to złe w przypadku wydajności. Zamiast 1 żądania agregacji wyślesz żądania "limit" do bazy danych. – Rayz

Powiązane problemy