$符代表什么意思
来源:4-3 【聚合操作】动手实战 - 从最常用的聚合管道阶段讲起(下)

鲁智深110
2019-08-06
对银行文档进行筛选
db.accounts.aggregate({
$match: {
"name.firstName": "alice"
}
})
返回数据
{ "_id" : ObjectId("5d499767e5333f1dd6de923e"), "name" : { "firstName" : "alice", "lastName" : "wong" }, "balance" : 50 }
如果我用"$name.firstName": “alice”,会报错?
unknown top level operator
我的理解是“$”是定位符,下面语法就可以成立
db.accounts.aggregate({
$project: {
_id: 0,
balance: 1,
nameArray: ["$name.firstName", "$name.middleName", "$name.lastName"]
}
})
请老师解答
写回答
1回答
-
同学你好~在你举出的这个例子里面,$match和$project两个聚合管道的语法规范不同:
$match管道使用的查询条件文档,当使用文档声明匹配查询的条件时,就是要直接写明进行匹配的字段名称,以及要匹配的值。这个查询条件文档的格式,和find()命令所使用的查询文档是同样的格式。$match这个管道比较特殊,它*不能*直接接收聚合表达式。如果需要在$match管道里使用聚合表示,必须用$expr操作符把聚合表达式包裹起来:{ $match: { $expr: { <aggregation expression> } } }
$project管道则是直接使用聚合表达式的。你的例子需要创建一个新的数组字段nameArray。这个新字段的定义必须由一个聚合表达式来声明。而在聚合表达式中,如果需要引用任何原有字段,必须要在字段名字前加上$操作符,这个就是聚合表达式的语法要求。
所以,长或短说,$match管道里不能直接使用聚合表达式,而$project管道里需要使用聚合表达式。这个区别导致了你所观察到的语句的不同。
012019-08-13
相似问题
如何导入导出海量数据呢?
回答 1
游标是什么意思?
回答 1