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当然,修改了我的答案