mongodb中$和“”的重要性

时间:2017-05-28 21:09:57

标签: mongodb

我正在学习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中“”和$的语法意义是什么。

1 个答案:

答案 0 :(得分:4)

嗨,让我们看看这些查询

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

请查看find的内容。 根据此find {field:value},您的第一个查询起作用,因为salary是有效字段。 你的第二个查询不起作用,因为没有字段$ salary

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

并且查询仍然可以正常运行但您的结果将为null。 我希望这会有所帮助,这对我们来说很有趣。