Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongodb内部的调用函数';什么是总量?_Node.js_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Node.js mongodb内部的调用函数';什么是总量?

Node.js mongodb内部的调用函数';什么是总量?,node.js,mongodb,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongodb Query,Aggregation Framework,收藏: [ { _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, $

收藏:

[
    { _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
当轮胎损坏或更换时,需要更换轮胎


将文档返回给用户时,应删除标记。相反,我们有一个状态字段,表示轮胎正常或损坏。

外部功能不适用于聚合框架。所有内容都在输入时解析为BSON,因此不允许使用JavaScript或其他任何内容。这基本上都是从BSON“操作符”定义到本机C++代码实现的处理,所以它非常快。 这归根结底是将您的预期逻辑“转换”为聚合框架可以处理的逻辑。事实上,有一些“逻辑”运算符,例如和,在这种情况下起作用:

db.collection.aggregate([
{“$project”:{
“_id”:1,
“地位”:{
“$cond”:[
{“$or”:[
//您的第一组规则要求“flag1”为“false”,或
//“flag2”和“true”表示“flag3”
{“$and”:[
{“$not”:[
{“$or”:[“$flag1”,“$flag2”]},
]},
“$flag3”
]},
//您的第二组规则要求“flag1”为“true”,或
//“flag2”和“false”表示“flag3”
{“$and”:[
{“$or”:[“$flag1”,“$flag2”]},
{“$not”:[“$flag3”]}
]},
]},
“好的”,
“破碎的”
]
}
}}
])

因此,没有外部函数,只需使用聚合框架提供的运算符实现逻辑即可。除了基本的逻辑实现之外,还需要“反转”ligic,它作为一个函数,以提供与
true/false
评估不同的结果

外部函数不适用于聚合框架。所有内容都在输入时解析为BSON,因此不允许使用JavaScript或其他任何内容。这基本上都是从BSON“操作符”定义到本机C++代码实现的处理,所以它非常快。 这归根结底是将您的预期逻辑“转换”为聚合框架可以处理的逻辑。事实上,有一些“逻辑”运算符,例如和,在这种情况下起作用:

db.collection.aggregate([
{“$project”:{
“_id”:1,
“地位”:{
“$cond”:[
{“$or”:[
//您的第一组规则要求“flag1”为“false”,或
//“flag2”和“true”表示“flag3”
{“$and”:[
{“$not”:[
{“$or”:[“$flag1”,“$flag2”]},
]},
“$flag3”
]},
//您的第二组规则要求“flag1”为“true”,或
//“flag2”和“false”表示“flag3”
{“$and”:[
{“$or”:[“$flag1”,“$flag2”]},
{“$not”:[“$flag3”]}
]},
]},
“好的”,
“破碎的”
]
}
}}
])

因此,没有外部函数,只需使用聚合框架提供的运算符实现逻辑即可。除了基本的逻辑实现之外,还需要“反转”ligic,它作为一个函数,以提供与
true/false
评估不同的结果

聚合调用可以传递回调函数,该函数在聚合完成后调用

function getValuesAndMessges( params, callback ) {

  db.collection.aggregate([
    { "$project": {
       "_id": 1,
       "flag1": { "$first": "$flag1" },
       "flag2": { "$first": "$flag2" },
       "flag3": { "$first": "$flag3" },
    }}
  ], function( err, results ) {
    if ( !err ) {
      result.forEach( result => {
        // process items in results here, setting a value
        // using the actual logic for writing message ...
        if( flag1 )
          result.message = "broken";
        else
          result.messsge = 'OK';
      });
    }
    callback(err, results);
  });
}

这样,每个聚合项(基于条件/参数)都将设置一个消息属性(或您选择编写的任何属性),您可以在调用函数中使用它们。

聚合调用可以传递一个回调函数,该函数在聚合完成后调用

function getValuesAndMessges( params, callback ) {

  db.collection.aggregate([
    { "$project": {
       "_id": 1,
       "flag1": { "$first": "$flag1" },
       "flag2": { "$first": "$flag2" },
       "flag3": { "$first": "$flag3" },
    }}
  ], function( err, results ) {
    if ( !err ) {
      result.forEach( result => {
        // process items in results here, setting a value
        // using the actual logic for writing message ...
        if( flag1 )
          result.message = "broken";
        else
          result.messsge = 'OK';
      });
    }
    callback(err, results);
  });
}

这样,每个聚合项(基于您的条件/参数)都将设置一个消息属性(或您选择编写的任何属性),您可以在调用函数中使用它们。

是的,我们可以用简单的方法调用聚合项目中的函数

let getStatus = (flag) => {
    return flag=='ok' ? 'ok' :'broken';
}
aggregate({
    $project: {
        '_id': 1,
        'status': getStatus($flag3)
    }
});

是的,我们可以用简单的方法调用聚合项目中的函数

let getStatus = (flag) => {
    return flag=='ok' ? 'ok' :'broken';
}
aggregate({
    $project: {
        '_id': 1,
        'status': getStatus($flag3)
    }
});

不,不是这样的。仅限于文件。人们在shell中发布这样的东西,却没有意识到它首先会求值,这会让人感到困惑。你到底想要什么,这就是为什么你“认为”你需要一个函数?是否可能确定其中一个字段是否为真?@NeilLunn该函数使用布尔表达式检查标志并返回字符串。我的文档中有大约10个布尔标志,我想把它们全部放在一起。“可能要确定这些字段中有一个是真的吗?”这会是什么样子?仍然不确定您在这里试图做什么。为什么第一个文档“正常”,第二个文档“损坏”?最好是在编辑问题时解释自己,然后你可以用评论通知你已经这样做了。显然,我们需要在聚合框架如何实现它时“实现您的逻辑”。但问题是“返回值背后的逻辑是什么?”不,这不是它的工作原理。仅限于文件。人们在shell中发布这样的东西,却没有意识到它首先会求值,这会让人感到困惑。你到底想要什么,这就是为什么你“认为”你需要一个函数?可能要确定这些字段中有一个是真的吗?@NeilLunn Th