mongodb中$和""的意义

Nis*_*hat 2 mongodb

我正在学习 MongoDB。对“$”的使用感到困惑我有如下架构的集合:

{
  _id: 1,
  "name": "test",
  "city": "gr",
  "sector": "IT",
  "salary":1000
}
Run Code Online (Sandbox Code Playgroud)

我在执行以下查询时发现以下输出:

 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.
Run Code Online (Sandbox Code Playgroud)

谁能解释一下,mongoDB中“”和$的语法意义是什么。

Sam*_*wal 6

嗨,让我们看看这些查询

1- db.user.find({salary:2000});          
2- db.user.find({$salary:2000});   
Run Code Online (Sandbox Code Playgroud)

看看这个find。根据此 find 需要 {field: value},您的第一个查询有效,因为薪水是有效字段。您的第二个查询不起作用,因为没有字段 $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"}}});  
Run Code Online (Sandbox Code Playgroud)

对于聚合,让我们看看这个$avg。这里说 $avg 需要 {$avg: expression}。所以你实际上是在那里保持表达而不是一个领域。

现在看看这个表达式。表达式可以是字段路径和系统变量、文字、表达式对象和表达式运算符。

查询编号 3、4、5 不是表达式对象或表达式运算符。因此,让我们消除这些选项。

现在让我们看看$literal。它指出文字可以是任何类型,但是 MongoDB 会将以美元符号开头的文字解析为字段的路径。

最后看看Field Path 和 System variables。它指出“要指定字段路径,请使用以美元符号 $ 为前缀的字符串......例如,“$user”指定用户字段的字段路径或“$user.name”指定字段路径到“用户名”字段。”

这意味着您将 $salary 指定为 $avg:"$salary" 中字段的路径,并且查询编号 3 有效。

查询编号 4 不起作用,因为 $salary 是无效表达式。

这应该解释“”的意义

查询编号 5 不起作用,因为它再次找不到任何要求平均值的字段。虽然它有效,因为它是一个有效的查询,但它只是返回 null。你本来可以

db.user.aggregate({$group:{_id:null,avg:{$avg:"some_non_existent_field"}}}); 
Run Code Online (Sandbox Code Playgroud)

查询仍然可以正常运行,但您的结果将为空。我希望这会有所帮助,这很有趣。