2017-02-10 2 views
2

Ich möchte $unwind 2 Felder, school und home. Datenbankstruktur ist wie;

{ 
    "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", 
     }, 
    ] 
} 

Ich wollte $unwindschool und home Felder und wie jeder von ihnen erhalten;

Die Abfrage, die ich schrieb, die darauf abzielt, Format oben zu erhalten, ist;

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

Aber die query Ergebnisse als Paare;

{ 
    "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" 
    } 
} 

Wie kann ich $unwind 2 Felder getrennt, anstatt dies führte Paar-Format?

+0

warum abwählen? Ist das nicht eine gut erklärte und direkte Frage? oder ist es schon beantwortet, ein duplikat? – mmu36478

Antwort

0

Es ist nicht direkt möglich. Mit MongoDB 3.4 gibt es eine mögliche Problemumgehung. $facet kann verwendet werden, um mehr als einen Satz von Pipeline-Operationen in einer einzigen Stufe im selben Dokument auszuführen. Es kann für Ihren Fall nützlich sein.

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' 
    } 
}) 
Verwandte Themen