2012-07-29 71 views
1

的比方說,我有一個集合:的MongoDB - 查詢收集通過聚集的產品子集值

[ 
    { 
     _id: product_a, 
     values: [ 
      { id: 1, value: 0 }, 
      { id: 2, value: 1 }, 
      { id: 3, value: 2 }, 
     ] 
    }, 
    { 
     _id: product_b, 
     values: [ 
      { id: 1, value: 1 }, 
      { id: 2, value: 2 }, 
      { id: 3, value: 2 }, 
     ] 
    }, 
    // etc ... 
]; 

有沒有辦法通過集合的子集的產品來查詢此集合「價值觀」?

如果我查詢{值:[1,3]},我會得到這樣的:

[ 
    { 
     _id: product_a, 
     result: 0 // since 0 * 2 = 0 
    }, 
    { 
     _id: product_b, 
     result: 2 // since 1 * 2 = 2 
    }, 
    // etc ... 
]; 
+0

是你的架構固定或可以存儲值爲{「id1」:「value」,「id2」:「value」...}而不是?即您的ID值是否已知? – 2012-07-29 19:30:19

回答

2

這裏是你如何與模式做它,你必須使用2.2聚合框架的方式。請注意,如果id/value對以id作爲關鍵字存儲,這會更簡單。

你聚集pipeline

[ 
    { 
     "$unwind" : "$values" 
    }, 
    { 
     "$match" : { 
      "values.id" : { 
       "$in" : [ 
        1, 
        3 
       ] 
      } 
     } 
    }, 
    { 
     "$project" : { 
      "_id" : 1, 
      "val1" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$values.id", 
          1 
         ] 
        }, 
        "$values.value", 
        -1 
       ] 
      }, 
      "val3" : { 
       "$cond" : [ 
        { 
         "$eq" : [ 
          "$values.id", 
          3 
         ] 
        }, 
        "$values.value", 
        -1 
       ] 
      } 
     } 
    }, 
    { 
     "$group" : { 
      "_id" : "$_id", 
      "val1" : { 
       "$max" : "$val1" 
      }, 
      "val3" : { 
       "$max" : "$val3" 
      } 
     } 
    }, 
    { 
     "$project" : { 
      "_id" : 1, 
      "result" : { 
       "$multiply" : [ 
        "$val1", 
        "$val3" 
       ] 
      } 
     } 
    } 
] 

注意最後一個步驟將做的工作,如果你的文檔的結構是: > db.collection.aggregate(pipeline)

{_id: "product_x", values: [ {id1: value}, {id2: value} etc. ]}

現在從殼與運行查詢

或從您的代碼通過db.runCommand({"aggregate":"collection","pipeline":[...]})

+0

感謝Asya,看起來太棒了!猜猜我必須使用Mongo的開發版本才能擁有此功能,對吧? – Mickel 2012-07-30 18:00:44

+0

是的,但它不是一個生產版本... – 2012-07-31 01:11:52