采集:
[ { _id: "Foo", flag1: false, flag2: true, flag3: false }, { _id: "Bar", flag1: true, flag2: false, flag3: true } ]
我的问题是,是否可以在聚合查询中调用方法?
aggregate({ $project: { '_id': 1, 'status' MyService.getStatus($flag1, $flag2, $flag3) } });
如果可能的话,它的语法是什么?结果:
[ { _id: "Foo", status: 'ok' }, { _id: "Bar", status: 'broken' } ]
在我的实际应用程序中,每个文档有10个布尔标志。如果用户获得了此文档,我想转换这些标志并给它们一个含义(对于用户)。例如认为文件代表轮胎。
flag1 = true means tire have good pressure, false means low pressure flag2 = true means depth of tire profile is good, false means little profile and so on
总而言之,我想说的是,如果
flag1, flag2 are true and flag3 is false
在以下情况下需要更换轮胎(破损或更换):
flag1, flag2 are false and flag3 is true
当文档返回给用户时,应删除标记。取而代之的是,我们有一个状态字段,说明轮胎是正常的还是损坏的。
外部函数不适用于聚合框架。一切都会在输入时解析为BSON,因此不允许JavaScript或其他任何内容。从BSON“运算符”定义到本机C ++代码实现,基本上都将这些处理完毕,因此它确实非常快。
这就是将您期望的逻辑“转换”为聚合框架可以处理的逻辑。其实有“逻辑”运营商,如 $or 和 $and 在这方面的工作:
$or
$and
db.collection.aggregate([ { "$project": { "_id": 1, "status": { "$cond": [ { "$or": [ // Your first set of rules requires "false" for "flag1" or // "flag2" and "true" for "flag3" { "$and": [ { "$not": [ { "$or": [ "$flag1", "$flag2" ] }, ]}, "$flag3" ]}, // Your second set of rules requires "true" for "flag1" or // "flag2" and "false" for "flag3" { "$and": [ { "$or": [ "$flag1", "$flag2" ] }, { "$not": [ "$flag3" ] } ]}, ]}, "ok", "broken" ] } }} ])
因此,没有外部功能,只需使用聚合框架提供的运算符来实现逻辑。除了基本的逻辑实现外,还有 $not “逆向”的斜率, $cond 它充当“三元”,以便提供与true/false评估结果不同的结果。
$not
$cond
true/false