2015-06-19 56 views
3

任何人都可以提供有關如何返回數組項的子集的建議嗎?例如,假設我有一個包含簡單_id鍵和包含對象數組的鍵的文檔集合(類似於下面的示例)。在MongoDB中返回數組項的子集

我想找到匹配一個簡單的條件,所有_id的和匹配對象:

// campaigns 
{ 
    "_id" : "Fred's C25K", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "nike" 
    }, 
    { 
     "date" : "2015-06-17", 
     "source" : "reebok", 
    }, 
    { 
     "date" : "2015-06-12", 
     "source" : "nike" 
    }, 
    { 
     "date" : "2015-06-14", 
     "source" : "adidas" 
    }, 
    ] 
}, 
{ 
    "_id" : "Mike's Marathon", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "nike" 
    } 
    ] 
}, 
{ 
    "_id" : "Jacob's Jamboree", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "keen" 
    } 
    ] 
} 

我想我的結果包含_id和條件,比方說任何匹配的對象的「日期值2015-06-17"

// GOAL => To generate a result set that looks like: 
{ 
    "_id" : "Fred's C25K", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "nike" 
    }, 
    { 
     "date" : "2015-06-17", 
     "source" : "reebok", 
    } 
    ] 
}, 
{ 
    "_id" : "Mike's Marathon", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "nike" 
    } 
    ] 
}, 
{ 
    "_id" : "Jacob's Jamboree", 
    "campaignData" : [ 
    { 
     "date" : "2015-06-17", 
     "source" : "keen" 
    } 
    ] 
} 

回答

1

使用aggregation framework,以達到預期的效果。以下流水線由操作員階段構成,作爲對應通過流水線的文檔進行過濾的第一步。下一階段是$unwind運算符,它從輸入文檔中解構campaignData數組字段以輸出每個元素的文檔。每個輸出文檔用一個元素值替換數組。然後,您需要再次執行$match步驟以獲取與給定日期條件匹配的子文檔。匹配的文件隨後將在接下來的$group管道步驟中使用通過$pushgroup accumulator operator保留原始數組:

db.collection.aggregate([ 
    { 
     "$match": { 
      "campaignData.date" : "2015-06-17" 
     } 
    }, 
    { 
     "$unwind": "$campaignData" 
    }, 
    { 
     "$match": { 
      "campaignData.date" : "2015-06-17" 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$_id", 
      "campaignData": { 
       "$push": "$campaignData" 
      } 
     } 
    } 
]) 

結果

/* 0 */ 
{ 
    "result" : [ 
     { 
      "_id" : "Mike's Marathon", 
      "campaignData" : [ 
       { 
        "date" : "2015-06-17", 
        "source" : "nike" 
       } 
      ] 
     }, 
     { 
      "_id" : "Jacob's Jamboree", 
      "campaignData" : [ 
       { 
        "date" : "2015-06-17", 
        "source" : "keen" 
       } 
      ] 
     }, 
     { 
      "_id" : "Fred's C25K", 
      "campaignData" : [ 
       { 
        "date" : "2015-06-17", 
        "source" : "nike" 
       }, 
       { 
        "date" : "2015-06-17", 
        "source" : "reebok" 
       } 
      ] 
     } 
    ], 
    "ok" : 1 
} 
+1

謝謝你許多!!!我不認爲我需要兩次在日期上匹配,但現在完全有意義。 –

+0

@RBrennan不用擔心,很高興能有所幫助。 – chridam