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