2017-05-28 6 views
0

Ich lerne MongoDB. Einsteigen Verwendung von „$“ verwirrt Ich habe Sammlung wie unter Schema:

{ 
    _id: 1, 
    "name": "test", 
    "city": "gr", 
    "sector": "IT", 
    "salary":1000 
} 

I unten Ausgabe finden auf der Ausführung unter Abfrage:

Query         Result 

db.user.find({salary:2000});   Works 
db.user.find({$salary:2000});   does not work(unknown top level operator: $salary) 
db.user.aggregate({$group:{_id:null,avg:{$avg:"$salary"}}}); Works 
db.user.aggregate({$group:{_id:null,avg:{$avg:$salary}}}); does not work($salary is not defined) 
db.user.aggregate({$group:{_id:null,avg:{$avg:"salary"}}}); gives wrong output. 

Kann jemand bitte erklären, was die syntaktische ist Bedeutung "" und $ in MongoDB.

Antwort

4

Hallo lässt

1- db.user.find({salary:2000});   
2- db.user.find({$salary:2000}); 

Werfen Sie einen Blick auf diese für find auf diese Fragen suchen. Nach diesem Fund dauert {field: value}, Ihre erste Abfrage funktioniert, weil Gehalt ein gültiges Feld ist. Ihre zweite Abfrage funktioniert nicht becuase es keine $ Gehalt Feld ist

3- db.user.aggregate({$group:{_id:null,avg:{$avg:"$salary"}}}); 
4- db.user.aggregate({$group:{_id:null,avg:{$avg:$salary}}}); 
5- db.user.aggregate({$group:{_id:null,avg:{$avg:"salary"}}}); 

Für Aggregation, lässt sich dieses $avg einen Blick darauf werfen. Hier heißt es, dass $ avg {$ avg: ausdruck} nimmt. Du machst also tatsächlich keinen Ausdruck da drüben.

Werfen Sie jetzt einen Blick auf diese für expression. Ausdruck kann Feldpfade und Systemvariablen, Literale, Ausdrucksobjekte und Ausdruckoperatoren sein.

Die Abfragezahlen 3,4,5 sind keine Ausdrucksobjekte oder Ausdrucksoperatoren. Also lasst uns diese Optionen beseitigen.

Werfen wir nun einen Blick auf $literal. Es besagt, dass Literale von jedem Typ sein können, aber MongoDB analysiert Literale, die mit einem Dollarzeichen als Pfad zu einem Feld beginnen.

Schließlich werfen Sie einen Blick auf Field Path and System variables. Er gibt an: "Um einen Feldpfad anzugeben, verwenden Sie eine Zeichenfolge, die ein Dollarzeichen $ vorangestellt hat. Beispiel:" $ user "zum Angeben des Feldpfads für das Benutzerfeld oder" $ user.name "zum Angeben des Felds Pfad zum "user.name" -Feld. "

Das heißt, Sie geben $ Gehalt als Pfad zu dem Feld in $ avg: "$ Gehalt" und Abfrage Nummer 3 funktioniert.

Abfrage Nummer 4 funktioniert nicht, weil $ Gehalt ein ungültiger Ausdruck ist.

Dies sollte die Bedeutung von „“

Abfragenummer 5 funktioniert nicht erklären, weil es wieder kein Feld mitteln findet. Obwohl es funktioniert, weil es eine gültige Abfrage ist, gibt es einfach null zurück. Sie könnten

db.user.aggregate({$group:{_id:null,avg:{$avg:"some_non_existent_field"}}}); 

und die Abfrage wird nach wie vor gut laufen haben, aber Sie werden für Ihre Ergebnisse null erhalten. Ich hoffe, das hilft, das war eine Menge Spaß zu sammeln.