2017-02-10 22 views
2

我想要$unwind 2个字段,schoolhome。数据库结构如同 ;

{ 
    "id" : 1, 
    "school" : [ 
     { 
      "path" : "school1", 
      "code" : "code1", 
     }, 
     { 
      "path" : "school2", 
      "code" : "code2", 
     }, 
     { 
      "path" : "school3", 
      "code" : "code3", 
     }, 
     { 
      "path" : "school4", 
      "code" : "code4", 
     } 
    ], 
    "home" : [ 
     { 
      "path" : "home1", 
      "code" : "homeCode1", 
     }, 
     { 
      "path" : "home2", 
      "code" : "homeCode2", 
     }, 
    ] 
} 

我想$unwindschoolhome领域,并得到他们每个人作为;

{ 
    "id" : 1, 
    "school" : [ 
     { 
      "path" : "school1", 
      "code" : "code1", 
     } 
}, 
{ 
    "id" : 1, 
    "school" : [ 
     { 
      "path" : "school2", 
      "code" : "code2", 
     } 
}, 
{ 
    "id" : 1, 
    "school" : [ 
     { 
      "path" : "school3", 
      "code" : "code3", 
     } 
}, 
{ 
    "id" : 1, 
    "school" : [ 
     { 
      "path" : "school4", 
      "code" : "code4", 
     } 
}, 
{ 
    "id" : 1, 
    "home" : [ 
     { 
      "path" : "home1", 
      "code" : "homeCode1", 
     } 
}, 
{ 
    "id" : 1, 
    "home" : [ 
     { 
      "path" : "home2", 
      "code" : "homeCode2", 
     } 
} 

我写的旨在获得上述格式的查询是;

db.collection.aggregate([ 
    {$unwind: "$school"}, 
    {$unwind: "$home"} 
]).pretty() 

query结果成对;

{ 
    "id" : 1, 
    "school" : { 
     "path" : "school1", 
     "code" : "code1" 
    }, 
    "home" : { 
     "path" : "home1", 
     "code" : "homeCode1" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school1", 
     "code" : "code1" 
    }, 
    "home" : { 
     "path" : "home2", 
     "code" : "homeCode2" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school2", 
     "code" : "code2" 
    }, 
    "home" : { 
     "path" : "home1", 
     "code" : "homeCode1" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school2", 
     "code" : "code2" 
    }, 
    "home" : { 
     "path" : "home2", 
     "code" : "homeCode2" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school3", 
     "code" : "code3" 
    }, 
    "home" : { 
     "path" : "home1", 
     "code" : "homeCode1" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school3", 
     "code" : "code3" 
    }, 
    "home" : { 
     "path" : "home2", 
     "code" : "homeCode2" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school4", 
     "code" : "code4" 
    }, 
    "home" : { 
     "path" : "home1", 
     "code" : "homeCode1" 
    } 
} 
{ 
    "id" : 1, 
    "school" : { 
     "path" : "school4", 
     "code" : "code4" 
    }, 
    "home" : { 
     "path" : "home2", 
     "code" : "homeCode2" 
    } 
} 

我怎样才能$unwind 2场分开,而不是这导致对格式?

+0

为什么要投票?这不是一个很好解释和直接的问题吗?还是已经回答了,重复? – mmu36478

回答

0

这不是直接可能的。使用MongoDB 3.4有一个可能的解决方法。 $facet可用于在同一文档的单个阶段中执行多个管道操作集。它可以用于你的情况。

db.collection.aggregate({ 
    '$facet': { 
     'school': [{ 
      '$unwind': '$school' 
     }, { 
      '$project': { 
       _id: '1', 
       school: 1 
      } 
     }], 
     'home': [{ 
      '$unwind': '$home' 
     }, { 
      '$project': { 
       _id: '1', 
       home: 1 
      } 
     }] 
    } 
}, { 
    '$project': { 
     'schoolAndHome': { 
      '$setUnion': ['$school', '$home'] 
     } 
    } 
}, { 
    '$unwind': '$schoolAndHome' 
}, { 
    '$replaceRoot': { 
     'newRoot': '$schoolAndHome' 
    } 
})