2015-06-08 16 views
9

Oto przykład z samouczka MongoDB (tutaj to zbiór ZIP Code db:MongoDB - obiekty? Dlaczego muszę _id w łącznej

db.zipcodes.aggregate([ 
    { $group: { _id: "$state", totalPop: { $sum: "$pop" } } }, 
    { $match: { totalPop: { $gte: 10*1000*1000 } } } 
]) 

jeśli mogę wymienić _id coś innego jak słowo Test, będę się komunikat o błędzie:

"errmsg" : "exception: the group aggregate field 'Test' must be defined as an expression inside an object", 
"code" : 15951, 
"ok" : 0 

czy ktoś może mi pomóc zrozumieć, dlaczego muszę _id na mój rozkaz? Myślałem MongoDB automatycznie przypisuje identyfikatory, jeśli jest stosowany nie dostarcza go.

Odpowiedz

5

W etapie $group do określenia stanu grupy używany jest _id. Oczywiście tego potrzebujesz.

Jeśli znasz środowisko SQL, pomyśl o nim jako o klauzuli GROUP BY.


Należy pamiętać w tym kontekście też _id jest naprawdę unikalny identyfikator w wygenerowanym kolekcji, ponieważ z definicji $group nie może produkować dwa dokumenty mające taką samą wartość dla tego pola.

+0

W SQL Mam grupę, a ja mam pole do grupy przez $ państwa, _id nie wygląda jak każdy analogowych SQL. – user1700890

3

Pole _id jest obowiązkowe, ale można ustawić go null jeśli nie nie chęć do agregacji w odniesieniu do klucza lub kluczy. Nieużywanie go skutkowałoby pojedynczą zagregowaną wartością nad polami. Działa w ten sposób "zastrzeżonym słowem", wskazując, jaki wynikowy "identyfikator"/klucz ma dla każdej grupy.

W twoim przypadku, grupowanie przez _id: "$state" skutkowałoby n zagregowanych wyników totalPop, pod warunkiem że istnieją n odrębne wartości state (podobny do SELECT SUM() FROM table GROUP BY state). Natomiast

$group : {_id : null, totalPop: { $sum: "$pop" }}} 

zapewni pojedynczy wynik dla totalPop (podobny do SELECT SUM() FROM table). To zachowanie jest dobrze opisane w operatorze grupy documentation.

5

Jedziemy do zrozumienia pole _id obrębie $group scenicznej & spojrzeć na niektóre najlepszych praktyk konstruowania _id S w grupie etapach agregacji. Spójrzmy na to zapytanie:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: { 
     founded_year: "$founded_year" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.founded_year": 1 
    } 
}]).pretty() 

MongoDB $group with document approach

Jedną rzeczą, która może nie być dla nas jasne, dlaczego jest pole _id zbudowany jest ten „dokument” sposób? Mogliśmy zrobić to w ten sposób, a także:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: "$founded_year", 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id": 1 
    } 
}]).pretty()

MongoDB $group without document approach

Nie robimy to w ten sposób, ponieważ w tych dokumentach wyjściowych - to nie jest jednoznaczne, co dokładnie oznacza ten numer. Tak naprawdę nie wiemy. A w niektórych przypadkach oznacza to zamieszanie w interpretacji tych dokumentów.Więc kolejny przypadek może grupować dokument _id z wielu dziedzin:


db.companies.aggregate([{ 
    $match: { 
    founded_year: { 
     $gte: 2010 
    } 
    } 
}, { 
    $group: { 
    _id: { 
     founded_year: "$founded_year", 
     category_code: "$category_code" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.founded_year": 1 
    } 
}]).pretty() 

group an _id document with multiple fields in MongoDB

$push prostu wypycha elementy do generowania tablic. Często może to być wymagane do grupy promowanych na polach do górnego poziomu:


db.companies.aggregate([{ 
    $group: { 
    _id: { 
     ipo_year: "$ipo.pub_year" 
    }, 
    companies: { 
     $push: "$name" 
    } 
    } 
}, { 
    $sort: { 
    "_id.ipo_year": 1 
    } 
}]).pretty()

group on promoted fields to upper level in MongoDB

Jest to także doskonały mieć wyrażenie postanawia dokumencie jako klucz _id.

db.companies.aggregate([{ 
    $match: { 
    "relationships.person": { 
     $ne: null 
    } 
    } 
}, { 
    $project: { 
    relationships: 1, 
    _id: 0 
    } 
}, { 
    $unwind: "$relationships" 
}, { 
    $group: { 
    _id: "$relationships.person", 
    count: { 
     $sum: 1 
    } 
    } 
}, { 
    $sort: { 
    count: -1 
    } 
}])

It's also perfect to have an expression that resolves to a document as a _id key in MongoDB

Powiązane problemy