2015-05-14 56 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

相关问题