如何通过应用来自另一个集合的规则来转换mongodb 3.4集合?

时间:2017-06-16 12:07:34

标签: mongodb aggregation-framework

我需要在从另一个集合中应用一些规则后从集合中派生文档。

我正在寻找确切的聚合查询来快速完成这种操作。

根据stats集合中定义的一些规则,规则可以转换以下rules集合。 Rulesstats不断变换,因此,我需要在查询时获得新的结果。

例如:

// collection to be transformed by the rules collection
stats = [
  {
    _id: 1,
    ratio: 3.0
  },
  {
    _id: 2,
    ratio: 0.5
  }
]

// rules for how to transform the stats collection
rules = [
  {
    coll: 'stats',  // apply the rule to stats collection
    source: '_id',  // match the _id field in the stats collection
    eq: 1,          // apply only when stats._id == 1
    ratio: 2.0      // multiply the ratio of stats for the matched docs
  },
  {
    coll: 'stats',
    source: '_id',
    eq: 2,
    disable: true   // omit stats._id == 2 from the output
  }
]

所以,如果我将规则应用于统计数据,我应该在聚合之后得到这个例子:

stats = [
  {
    _id: 1,
    ratio: 6.0
  }
]

// 1st rule multiplied the 1st document of stats with 2.0
// 2nd rule disabled fetching the 2nd document of stats

Stats集合包含数十万个文档,而Rules集合包含数千个文档

我查看了聚合框架,看起来可以用它完成。或者,我需要逐个应用我的应用程序代码中的规则来获得我想要的结果,但这可能很慢。

另请参阅堆栈交换软件工程中的this question

1 个答案:

答案 0 :(得分:1)

根据下面的屏幕截图,此聚合框架查询提供了您想要的结果:

db.mystats.aggregate([
   {$lookup:
     {
       from: "rules",
       localField: "_id",
       foreignField: "eq",
       as: "docs"
     }
   },
   {$unwind:"$docs"},
   {$match: 
     { "docs.disable":{ "$exists": false}}
   },
   {$project: 
     {
        "_id":"$_id", 
        "ratio": { $multiply: [ "$ratio", "$docs.ratio" ] }
     }
    }
]
)

这里是您提供的输入示例的查询执行输出:

enter image description here