我需要在从另一个集合中应用一些规则后从集合中派生文档。
我正在寻找确切的聚合查询来快速完成这种操作。
根据stats
集合中定义的一些规则,规则可以转换以下rules
集合。 Rules
和stats
不断变换,因此,我需要在查询时获得新的结果。
例如:
// 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。
答案 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" ] }
}
}
]
)
这里是您提供的输入示例的查询执行输出: