2015-05-14 78 views
1

MongoDB的合計結果我最近提出這個問題,幫助我獲得的數組,目前已經在聚合MongoDB中查詢得到的結果(MongoDB Aggregate Array with Two Fields有兩個不同的密鑰

我的問題是要獲得合併兩個不同的密鑰。

我有這一個產品集合與一般產品:

{ 
    "_id" : ObjectId("554b9f223d77c810e8915539"), 
    "brand" : "Airtex", 
    "product" : "E7113M", 
    "type" : "Fuel Pump", 
    "warehouse_sku" : [ 
    "1_5551536f3d77c870fc388a04", 
    "2_55515e163d77c870fc38b00a" 
    ] 
} 

而且我有以下的兒童產品(它有多個一般產品就可以了)

{ 
    "_id" : ObjectId("55524d0c3d77c8ba9cb2d9fd"), 
    "brand" : "Performance", 
    "product" : "P41K", 
    "type" : "Fuel Pump Component", 
    "general_products" : [ 
     ObjectId("554b9f123d77c810e891552f"), 
     ObjectId("554b9f143d77c810e8915530"), 
     ObjectId("554b9f173d77c810e8915533"), 
     ObjectId("554b99b83d77c810e8915436"), 
     ObjectId("554b9f2e3d77c810e8915549") 
    ], 
    "warehouse_sku" : [ 
     "1_555411043d77c8066b3b6720", 
     "1_555411073d77c8066b3b6728" 
    ] 
} 

這裏我的問題是我希望使用_id和內部子產品的一般產品符合特定的warehouse_sku模式。期望的結果是這樣的:

{ "_id" : ObjectId("554b9f2e3d77c810e8915549") } 
{ "_id" : ObjectId("554b99b83d77c810e8915436") } 
{ "_id" : ObjectId("554b9f173d77c810e8915533") } 
{ "_id" : ObjectId("554b9f143d77c810e8915530") } 
{ "_id" : ObjectId("554b9f123d77c810e891552f") } 
{ "_id" : ObjectId("554b9f223d77c810e8915539") } 

我已經由多個查詢:

1)

db.products.aggregate([ 
... {$match:{warehouse_sku: /^1/ }}, 
... {$unwind:"$general_products"}, 
... {$group:{_id: "$general_products"}} 
... ]) 

但是從一般產品的_id不是它:

{ "_id" : ObjectId("554b9f2e3d77c810e8915549") } 
{ "_id" : ObjectId("554b99b83d77c810e8915436") } 
{ "_id" : ObjectId("554b9f173d77c810e8915533") } 
{ "_id" : ObjectId("554b9f143d77c810e8915530") } 
{ "_id" : ObjectId("554b9f123d77c810e891552f") } 

2)

db.products.aggregate([ 
... {$match:{warehouse_sku: /^1/ }}, 
... {$group:{_id: "$_id"}} 
... ]) 

,但給我一般和兒童產品的_id [不希望它]但不是_id的從普通產品的子產品內部:

{ "_id" : ObjectId("55524d0c3d77c8ba9cb2d9fd") } 
{ "_id" : ObjectId("554b9f223d77c810e8915539") } 

回答

1

使用下聚合管道,以獲得所需ObjectIds列表。本品採用$ifNull聚集操作添加_id場如果陣列general_products字段不存在:

db.products.aggregate([ 
    { 
     "$match": {"warehouse_sku": /^1/ } 
    }, 
    { 
     "$group": { 
      "_id": { 
       "_id": "$_id", 
       "general_products": "$general_products" 
      }, 
      "data": { 
       "$addToSet": "$_id" 
      } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "general_products": { 
       "$ifNull": ["$_id.general_products", "$data"] 
      } 
     } 
    }, 
    { 
     "$unwind": "$general_products" 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "list_products": { 
       "$addToSet": "$general_products" 
      } 
     } 
    } 
]); 

這會給你一個數組list_products用的ObjectID的文件:

/* 1 */ 
{ 
    "result" : [ 
     { 
      "_id" : null, 
      "list_products" : [ 
       ObjectId("554b9f223d77c810e8915539"), 
       ObjectId("554b9f2e3d77c810e8915549"), 
       ObjectId("554b99b83d77c810e8915436"), 
       ObjectId("554b9f173d77c810e8915533"), 
       ObjectId("554b9f143d77c810e8915530"), 
       ObjectId("554b9f123d77c810e891552f") 
      ] 
     } 
    ], 
    "ok" : 1 
} 
+1

的MongoDB的主查詢...感謝您的幫助 –

+0

@technology_dreamer不用擔心:-) – chridam

相關問題