$符代表什么意思

来源: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回答

Stannum

2019-08-13

同学你好~在你举出的这个例子里面,$match和$project两个聚合管道的语法规范不同:

  1. $match管道使用的查询条件文档,当使用文档声明匹配查询的条件时,就是要直接写明进行匹配的字段名称,以及要匹配的值。这个查询条件文档的格式,和find()命令所使用的查询文档是同样的格式。$match这个管道比较特殊,它*不能*直接接收聚合表达式。如果需要在$match管道里使用聚合表示,必须用$expr操作符把聚合表达式包裹起来:{ $match: { $expr: { <aggregation expression> } } }

  2. $project管道则是直接使用聚合表达式的。你的例子需要创建一个新的数组字段nameArray。这个新字段的定义必须由一个聚合表达式来声明。而在聚合表达式中,如果需要引用任何原有字段,必须要在字段名字前加上$操作符,这个就是聚合表达式的语法要求。

所以,长或短说,$match管道里不能直接使用聚合表达式,而$project管道里需要使用聚合表达式。这个区别导致了你所观察到的语句的不同。

0
1
鲁智深110
非常感谢!
2019-08-13
共1条回复

玩转MongoDB4.0(最新版) 从入门到实践

30%理论+70%实战,用实操检验真理,一门让你事半功倍的入门进阶课

1138 学习 · 197 问题

查看课程