2017-05-28 56 views
0

我正在學習MongoDB。上的「$」 使用越來越困惑我有收集如下模式:

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

我發現下面的輸出下面的查詢執行:

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. 

誰能請解釋一下,什麼是的語法意義「」和$在mongoDB中。

回答

4

喜讓我們來看看這些查詢

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

看看本作find。 根據這個查找需要{字段:值},您的第一個查詢工作,因爲薪水是有效的字段。 你的第二個查詢不工作監守沒有場$工資

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"}}}); 

對於聚集,讓我們一起來看看這款$avg。 這裏說$ avg需要{$ avg:expression}。所以你實際上在那裏沒有一個領域的表達。

現在看看這個爲expression。表達式可以是字段路徑和系統變量,文字,表達式對象和表達式運算符。

查詢號3,4,5不是表達式對象或表達式運算符。所以讓我們消除這些選項。

現在我們來看看$literal。 它指出文字可以是任何類型,但是MongoDB會將以美元符號開頭的文字分析爲字段的路徑。

終於看看Field Path and System variables。 它聲明「要指定一個字段路徑,請使用以美元符號$前綴的字符串。例如,」$ user「指定用戶字段的字段路徑或」$ user.name「來指定字段到「user.name」字段的路徑。「

這意味着您將$ salary指定爲$ avg中的字段的路徑:「$ salary」並且查詢編號3有效。

查詢編號4不起作用,因爲$ salary是無效表達式。

這應該解釋「」

查詢號碼5沒有工作的重要意義,因爲它再次沒有發現任何領域的平均上。儘管它有效,因爲它是一個有效的查詢,它只是返回null。 你可以有

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

和查詢將仍然運行良好,但你會得到空你的結果。 我希望這可以幫助,這是很多樂趣收集。