我正在学习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中“”和$的语法意义是什么。
答案 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。 我希望这会有所帮助,这对我们来说很有趣。