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/8/xslt/3.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投影中,是否有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名任何现有字段 因此,如果我从具有“field1”和“field2”的集合开始,并执行以下投影: { $project: { field3: { $gt: ['$field1', 10] } } } 我想以“field1”、“field2”和“field3”作为下一阶段的输入或聚合框架的输出结束 我试图通过排除_id将投影置于排除模式,但这不起作用。默认情况下仅投影\u id。您必须指定必须投影的

在MongoDB投影中,是否有办法指定一些新字段(但同时保留输入到管道投影阶段的字段)?我没有重命名任何现有字段

因此,如果我从具有“field1”和“field2”的集合开始,并执行以下投影:

{ $project: { field3: { $gt: ['$field1', 10] } } }
我想以“field1”、“field2”和“field3”作为下一阶段的输入或聚合框架的输出结束


我试图通过排除_id将投影置于排除模式,但这不起作用。

默认情况下仅投影
\u id
。您必须指定必须投影的其他字段

{ $project: { field1:1,field2:1, field3: { $gt: ['$field1', 10] } } }


MongoDB 2.6引入了一个新的聚合变量,它几乎满足了您的需求:它将包含当前管道阶段正在处理的完整文档,因此您不需要知道或指定要包含哪些字段

以聚合为例,使用
$$ROOT
添加
字段
投影:

db.pipeline.aggregate(
    { $project: {
        field3: {
            $gt: ['$field1', 10]
        },
        fields: "$$ROOT"
    }}
)
输出将包括新计算字段和所有原始字段:

{
    "_id" : ObjectId("53b56cc542974939144cee2a"),
    "field3" : false,
    "fields" : {
        "_id" : ObjectId("53b56cc542974939144cee2a"),
        "field1" : 1,
        "field2" : 2,
        "field3" : 3
    }
}

MongoDB 3.3.11引入了
addFields
聚合阶段,可以满足您的需求。请参阅MongoDB问题跟踪器中的此项:。

其中,
$project
需要指定要传递的字段,将返回所有字段并添加或替换指定的字段

{ $addFields: { field3: { $gt: ['$field1', 10] } } }
将完全实现你想要的


请注意,这项功能是在Mongo 3.4版中添加的。

如果我知道作为投影输入存在的所有字段,这项功能就会起作用。因为这是自动生成过程的一部分,所以很难(不是不可能,但不是理想的)在任何给定的投影之前跟踪哪些字段可用。我正在寻找一种可以自动让这些现有字段通过的解决方案(但这可能不存在——只是询问是否存在)。
默认情况下始终包含_id字段。
中的语句隐式提到默认情况下不会投影其余字段。在中也提出了这个问题,其中包含一些有用的(不同的)答案。请注意,
$addFields
也可以替换或更改现有字段(如果您为其指定相同的名称),同时包括所有其他字段,例如,如果您希望在数组上使用
$filter
,但在投影中保留所有其他字段,这将非常有用。
{ $addFields: { field3: { $gt: ['$field1', 10] } } }