代码之家  ›  专栏  ›  技术社区  ›  oarfish

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

  •  1
  • oarfish  · 技术社区  · 7 年前

    {
       _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, …]
                  },
                 ]
    }
    

    现在我的目标是检索所有文档,但是 $map name 属性,丢弃其他字段。我想我可以这样做:

    pipeline = [{'$project': {'metrics': {'$map': {'input': '$metrics', 'in': '$this.name'}]
    results = client.db.runs.aggregate(pipeline)
    

    但结果却恰恰相反 None 每个数组项的值( {'metrics': [None, None, None, …]} ),就像请求的字段一样 名称

    1 回复  |  直到 7 年前
        1
  •  1
  •   mickl    7 年前

    里面 $map 你可以用 as 定义临时变量,该变量将表示来自 metrics 然后在中引用该变量 in 部分

    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" ] }
    
    推荐文章