将变量传递到MongoDB视图

时间:2018-10-12 20:48:55

标签: mongodb

我正在尝试在MongoDB中进行视图以避免不必要的返回。在文档中说聚合函数可以接受带有双美元符号的变量,考虑到这一点,我已经创建了一个观点,在此示例中,应该采用一个变量来过滤customerIds并将结果分组以汇总不同文档的付款。 / p>

示例:

db.createView(
  "viewName",
  "myCollection",
  [{
    $match: {  "customerId": "$$customerId", }
  },{
    $group: {
      _id: null,
      total: "$amount",
    }
  }]
)

视图创建成功,如果我将一些有效的customerId放在可以正常工作的聚合函数中,但是我丝毫不知道如何执行视图并传递所需的customerID。 / p>

有什么想法吗?在这种情况下,mongodb文档无法为我提供帮助,我确实需要将其创建为视图,因为有许多应用程序可以连接到该视图。

我尝试过:     db.viewName.find({customerId:“某些有效ID”});

2 个答案:

答案 0 :(得分:0)

您可以像收藏一样访问它,例如,我通过以下方式创建视图:

db.runCommand({
  create: 'AuthorsView',
  viewOn: 'authors',
  pipeline: [{
    "$group": {
      "_id": "$email",
      "count": {
        "$sum": 1
      }
    }
  }]
})

由于这是现有视图,所以我可以简单地进行以下操作:

db.getCollection('AuthorsView').find({})

要查看所有文档或向find添加更多参数

不确定传递变量的含义,因为视图就像集合……您可以通过findaggregate对它们进行查询。

答案 1 :(得分:0)

首先,如果没有$match,则不能将变量传递到$expr。没有错误,因为“ $$ ...”被解释为字符串。

第二,如果我们修复以下问题:

db.createView(
  "viewName",
  "myCollection",
  [{
    $match: {$expr:{$eq:["$customerId","$$customerId"]}}, }
  },{
    $group: {
      _id: null,
      total: "$amount",
    }
  }]
)

但是$$不是系统变量,因此它将不起作用。您可以传递$$ROOT之类的系统变量或$field.path的字段路径; 用户定义的变量由系统变量或收集数据组成。