在mongodb的聚合内调用函数?

Upv*_*ote 1 mongodb node.js mongodb-query aggregation-framework

采集:

[
    { _id: "Foo", flag1: false, flag2: true, flag3: false },
    { _id: "Bar", flag1: true, flag2: false, flag3: true }
]
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以在聚合查询中调用方法?

aggregate({
    $project: {
        '_id': 1,
        'status' MyService.getStatus($flag1, $flag2, $flag3)
    }
});
Run Code Online (Sandbox Code Playgroud)

如果可能的话,它的语法是什么?结果:

[
    { _id: "Foo", status: 'ok' },
    { _id: "Bar", status: 'broken' }
]
Run Code Online (Sandbox Code Playgroud)

在我的实际应用程序中,每个文档有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
Run Code Online (Sandbox Code Playgroud)

总而言之,我想说的是,如果

 flag1, flag2 are true and flag3 is false
Run Code Online (Sandbox Code Playgroud)

并且在以下情况下需要更换轮胎(破损或更换):

flag1, flag2 are false and flag3 is true
Run Code Online (Sandbox Code Playgroud)

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

Nei*_*unn 5

外部函数不适用于聚合框架。一切都会在输入时解析为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"
           ]
       }
    }}
])
Run Code Online (Sandbox Code Playgroud)

因此,没有外部功能,只需使用聚合框架提供的运算符来实现逻辑。除了基本的逻辑实现之外,还有一个$not“逆向”的斜体,$cond它充当“三元”,以提供与true/false评估结果不同的结果。