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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
MongoDB聚合项目基于匹配条件的不同字段?_Mongodb_Aggregation Framework - Fatal编程技术网

MongoDB聚合项目基于匹配条件的不同字段?

MongoDB聚合项目基于匹配条件的不同字段?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在MongoDB中使用aggregation编写一个查询,如果条件1匹配,那么我想投影一些字段,当条件2匹配时,我想投影一些不同的字段,当第三个条件3达到时,我想投影一些其他不同的字段 我的问题如下 { $match: { $and: [ { {field_a: "henesa"} }, { $expr: {

我正在MongoDB中使用
aggregation
编写一个查询,如果
条件1
匹配,那么我想投影一些字段,当
条件2
匹配时,我想投影一些不同的字段,当第三个
条件3
达到时,我想投影一些其他不同的字段

我的问题如下

{
    $match: {
        $and: [
            {
                {field_a: "henesa"}
            },
            {
                $expr: {
                    $or: [
                        { Condition 1}, {Condition 2}, {condition 3}
                    ]
                }
            }
        ]

    }
},
{$project: { /* Here How To Decide which params to send */}}
谁能告诉我怎么做。

您可以在投影阶段使用的语法

部分中,您可以使用它根据您的标准投影值。例如

{ $project: {
    field: { $switch: {
        branches: [
             { case: Condition 1, then: "$field1" },
             { case: Condition 2, then: "$field2" },
             ...
        ]
    } }
} }
或更复杂的组合,如果您需要处理满足多个
$或
条件的情况。

您可以在投影阶段使用的
语法

部分中,您可以使用它根据您的标准投影值。例如

{ $project: {
    field: { $switch: {
        branches: [
             { case: Condition 1, then: "$field1" },
             { case: Condition 2, then: "$field2" },
             ...
        ]
    } }
} }

或者更复杂的组合,如果您需要处理满足多个
$或
条件的情况。

在我描述的查询中,文档首先匹配查询,如果整个查询匹配,则仅投影结果,但在您的情况下,一些文档在$project阶段被拒绝,所以你不认为这会导致你的查询延迟吗。由于一些文档在$project阶段被拒绝,而这些文档本应在$match阶段首先被拒绝。如果不清楚投影阶段是否取代整个管道,我将更新答案。这是如何决定发送哪个参数的示例*/}
问题的一部分。投影舞台不会拒绝任何东西。它会重新塑造上一阶段提供的文档。您同时在$project和$match中写入条件?因为如果您再次写入,则在$project阶段将再次花费一些额外的时间来检查条件是否正确?是的,$match和$project阶段中的条件应该相同。这就是为什么我在问题中加入了你发布的确切条件。是的,它会花费额外的CPU滴答声。如果你问如何免费获得它,你应该在问题中说明。答案很简单——你不能。在我描述的查询中,文档首先匹配查询,如果整个查询匹配,则只投影结果,但在你的情况下,一些文档在$project阶段被拒绝,因此你不认为这会导致查询延迟吗。由于一些文档在$project阶段被拒绝,而这些文档本应在$match阶段首先被拒绝。如果不清楚投影阶段是否取代整个管道,我将更新答案。这是如何决定发送哪个参数的示例*/}
问题的一部分。投影舞台不会拒绝任何东西。它会重新塑造上一阶段提供的文档。您同时在$project和$match中写入条件?因为如果您再次写入,则在$project阶段将再次花费一些额外的时间来检查条件是否正确?是的,$match和$project阶段中的条件应该相同。这就是为什么我在问题中加入了你发布的确切条件。是的,它会花费额外的CPU滴答声。如果你问如何免费获得它,你应该在问题中说明。答案很简单明了——你不能。