2017-03-07 23 views
1

我有一个关于MongoDB聚合查询的问题,它几乎类似于$unwind 2 fields separately in mongodb queryMongoDB分别展开2个嵌入式阵列

这是文件:

{ 
    "_id" : "1", 
    "details" : { 
     "phonenumber" : [ 
      "1", 
      "2" 
     ], 
     "name" : [ 
      "a", 
      "b" 
     ] 
    } 
} 

,我试图来构建查询将返回我以下结果:

{ "_id" : "1", "phonenumber" : "1", "name" : null }, 
{ "_id" : "1", "phonenumber" : "2", "name" : null }, 
{ "_id" : "1", "phonenumber" : null, "name" : "a" }, 
{ "_id" : "1", "phonenumber" : null, "name" : "b" } 

可能有人请帮助我吗?

我能想出

最近的解决方案是通过以下查询:

db.document.aggregate([ { $unwind: { path: "$details.name"} }, { $unwind: { path: "$details.phonenumber" } }, { $project: { _id: 1, name: "$details.name", phonenumber: "$details.phonenumber" } } ]) 

而且从上述查询的输出为:

{ "_id" : "1", "phonenumber" : "1", "name" : "a" }, 
{ "_id" : "1", "phonenumber" : "1", "name" : "b" }, 
{ "_id" : "1", "phonenumber" : "2", "name" : "a" }, 
{ "_id" : "1", "phonenumber" : "2", "name" : "b" } 
+0

你可以给你的集合中的文档的完整的例子吗?在你的尝试中,你有'$ details.email'。 –

+0

聚合流水线是顺序的。一个阶段的输出将被输入到另一个阶段。你要做的是将初始数据分成两个阶段。这是不可能的。 – RaR

+0

@ʰᵈˑ我在问题中编辑了'email'字段和'name'。这是一个错字。 –

回答

1

随着MongoDB v3.4,可能的解决方案将是一个,

db.document.aggregate({ 
    '$facet': { 
     'phonenumber': [{ 
      '$unwind': '$details.phonenumber' 
     }, { 
      '$project': { 
       phonenumber: '$details.phonenumber', 
       name: null 
      } 
     }], 
     'name': [{ 
      '$unwind': '$details.name' 
     }, { 
      '$project': { 
       name: '$details.name', 
       phonenumber: null 
      } 
     }] 
    } 
}, { 
    '$project': { 
     'combined': { 
      '$setUnion': ['$phonenumber', '$name'] 
     } 
    } 
}, { 
    '$unwind': '$combined' 
}, { 
    '$replaceRoot': { 
     'newRoot': '$combined' 
    } 
}) 

facet允许我们公司一个阶段,这是从版本为早期版本的MongoDB 3.4

1

替代的解决方案中的路得多个聚合管道,

db.document.aggregate([{ 
     $unwind: { 
      path: "$details.name" 
     } 
    }, { 
     $group: { 
      _id: "$_id", 
      nameArr: { 
       $push: { 
        name: "$details.name", 
        phonenumber: { 
         $ifNull: ["$description", null] 
        } 
       } 
      }, 
      "details": { 
       $first: "$details" 
      } 
     } 
    }, { 
     $unwind: "$details.phonenumber" 
    }, { 
     $group: { 
      _id: "$_id", 
      phoneArr: { 
       $push: { 
        phonenumber: "$details.phonenumber", 
        name: { 
         $ifNull: ["$description", null] 
        } 
       } 
      }, 
      "nameArr": { 
       $first: "$nameArr" 
      } 
     } 
    }, { 
     $project: { 
      _id: 1, 
      value: { 
       $setUnion: ["$nameArr", "$phoneArr"] 
      } 
     } 
    }, { 
     $unwind: "$value" 
    }, { 
     $project: { 
      name: "$value.name", 
      phonenumber: "$value.phonenumber" 
     } 
    }]) 
+0

这也适用!谢谢 :) –