2017-05-28 54 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"}}}); 

和查询将仍然运行良好,但你会得到空你的结果。 我希望这可以帮助,这是很多乐趣收集。