一尘不染

在mongodb的聚合内调用函数?

node.js

采集:

[
    { _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

当文档返回给用户时,应删除标记。取而代之的是,我们有一个状态字段,说明轮胎是正常的还是损坏的。


阅读 381

收藏
2020-07-07

共1个答案

一尘不染

外部函数不适用于聚合框架。一切都会在输入时解析为BSON,因此不允许JavaScript或其他任何内容。从BSON“运算符”定义到本机C
++代码实现,基本上都将这些处理完毕,因此它确实非常快。

这就是将您期望的逻辑“转换”为聚合框架可以处理的逻辑。其实有“逻辑”运营商,如
$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评估结果不同的结果。

2020-07-07