簡體   English   中英

如何在 MongoDB $projection 中使用 $map

[英]How do I use $map in a MongoDB $projection

我有一個包含以下文檔的數據庫:

{
   _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)

但是結果對於每個數組條目( {'metrics': [None, None, None, …]} )只有None值,就好像請求的字段name不存在一樣。 但確實如此。 我也嘗試過使用 id 字段,但無濟於事。 我可以在檢查數據時看到字段在那里。 我無法弄清楚我在這里做錯了什么。

里面的$地圖,您可以使用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" ] }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM