【问题标题】:Aggregation. Using $let inside $match聚合。在 $match 中使用 $let
【发布时间】:2017-06-23 19:04:29
【问题描述】:

我已经阅读了有关在 mongo 聚合中使用 $let 的信息。但是所有的例子都只在$project 阶段使用$let。我想知道是否可以在 $match 聚合阶段使用 $let ?这是一个简单的例子:

var Color = "Black";

db.mydata.aggregate([
    { "$match": {     
       "Category": "MyCategory",
       "Location":"London",
       "Color": $let: {
                  vars: {
                    "Color": Color
                  },
                  in: { 
                    "$$Color" 
                  }
                }
}},    
    // other stages as group, project and sort
    ...
])

以上抱怨Expected expression... 那么是否有可能以某种方式在$match 或聚合的其他阶段使用$let

EDIT: 这也不行:

var Color = "Black";

db.mydata.aggregate([
    { "$match": {     
       "Category": "MyCategory",
       "Location":"London",
       "Color": "$$Color"
}},    
    // other stages as group, project and sort
    ...
])

但是按照https://docs.mongodb.com/v3.2/reference/aggregation-variables/应该呢? 最好的问候

【问题讨论】:

  • 目的是什么?
  • @hyades 使用聚合之外的用户定义变量动态创建聚合查询。
  • 可以像这里一样可以"Color": Color具体目的是什么?
  • @hyades 对不起,不太明白你的意思。我的意思是,如果我有一个用户在网站的输入框中单击颜色,则用户可以将颜色更改为另一种颜色,并且将对 mongo 进行新的聚合查询。所以颜色变量需要是动态的,而不是静态的。
  • @hyades 请同时查看编辑。

标签: mongodb aggregation-framework


【解决方案1】:

您可以直接使用变量。Node 或 mongo shell 将负责将变量替换为字符串。无需将它们存储为内部 mongo 变量或聚合变量。

var Color = "Black";

db.mydata.aggregate([
    { "$match": {     
       "Category": "MyCategory",
       "Location":"London",
       "Color": Color // this would be replaced by string "Black" by node
}},    
    // other stages as group, project and sort
    ...
])

这个查询在 Mongo 中执行为

db.mydata.aggregate([
        { "$match": {     
           "Category": "MyCategory",
           "Location":"London",
           "Color": "Black" 
    }},    
        // other stages as group, project and sort
        ...
    ])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2020-07-12
    • 2015-12-28
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多