Python 如何在MongoDB$投影中使用$map

Python 如何在MongoDB$投影中使用$map,python,arrays,mongodb,aggregation-framework,Python,Arrays,Mongodb,Aggregation Framework,我有一个包含以下文档的数据库: { _id: 123, metrics: [{ _id: ObjectID(…), name: 'foo', steps: [1, 2, 3, …], values: [10, 12, 13, …] }, { _id: ObjectID(…

我有一个包含以下文档的数据库:

{
   _id: 123, 
   metrics: [{ 
               _id: ObjectID(…), 
               name: 'foo',
               steps: [1, 2, 3, …], 
               values: [10, 12, 13, …]
              },
              { 
               _id: ObjectID(…), 
               name: 'bar',
               steps: [1, 2, 3, …], 
               values: [1.2, 1.2, 1.3, …]
              },
             ]
}
pipeline = [{'$project': {'metrics': {'$map': {'input': '$metrics', 'in': '$this.name'}]
results = client.db.runs.aggregate(pipeline)
现在,我的目标是检索所有文档,但将所有数组项映射到它们的
name
属性,丢弃其他字段。我想我可以这样做:

{
   _id: 123, 
   metrics: [{ 
               _id: ObjectID(…), 
               name: 'foo',
               steps: [1, 2, 3, …], 
               values: [10, 12, 13, …]
              },
              { 
               _id: ObjectID(…), 
               name: 'bar',
               steps: [1, 2, 3, …], 
               values: [1.2, 1.2, 1.3, …]
              },
             ]
}
pipeline = [{'$project': {'metrics': {'$map': {'input': '$metrics', 'in': '$this.name'}]
results = client.db.runs.aggregate(pipeline)
但是对于每个数组条目,结果只有
None
值(
{'metrics':[None,None,None,…]}
),就好像请求的字段
name
不存在一样。但确实如此。我也尝试过id字段,但没有效果。我可以在检查数据时看到字段在那里。我不知道我做错了什么。

在内部,您可以使用
as
来定义临时变量,该变量将表示来自
度量的单个文档,然后在
部分的
中引用该变量

db.col.aggregate([{'$project': {'metrics': {'$map': {'input': '$metrics', as: 'metric', 'in': '$$metric.name' } } } }])
或者您可以直接引用一个临时变量
this

db.col.aggregate([{'$project': {'metrics': {'$map': {'input': '$metrics', 'in': '$$this.name' } } } }])
问题是,每次使用单美元符号时,都会引用当前管道阶段正在处理的文档中定义的字段。此外,您可以使用双美元符号来引用一些可以由操作符定义的变量,如
$map
$filter

您可以尝试以下文档的初始代码:

{
    _id: 123, 
    this: { name: "x" },
    metrics: [{ }, { } ]
}
您将得到一个包含两个
x
值的数组,因为有两个度量,但每次迭代都引用相同的
this.x
值:

{ "_id" : 123, "metrics" : [ "x", "x" ] }

我知道,但文档中说:as-Optional。表示输入数组中每个单独元素的变量的名称。如果未指定名称,则变量名默认为
this
。指定名称也不会更改结果。更新:双
$$
似乎是问题所在。不知道什么时候用。我以前试过,但没成功,但现在成功了_(ツ)_/“您能详细说明双美元符号的用法或链接相关文档吗?然后我可以接受这个答案。@oarfish当然,修改了我的答案